void delete_str(const char* theString) {
// if (theString is pointing to dynamic objects delete it)
delete[] theString;
// else do nothing
}
int main() {
char str[4] = {'a', 'b', 'c', ' '};
const char* str0 = "abc"; // assign "abc" to str0
char* str1 = new char[strlen("abc")+1]; for (int i = 0; i < 4; i++) str1[i] = str[i]; // assign "abc" to str1
delete_str(str0); // run time error
delete_str(str1); // ok
}
在此示例中,我想定义一个函数delete_str()
以删除theString
指向的内容。但是我如何确定它是否指向字符串文字?
你无法确定。程序员需要手动跟踪指针指向的对象是如何创建的。
这就是为什么不应该直接使用从new
创建的原始指针的原因之一,除非在专门管理单个此类分配的类的实现中。
使用std::string
.可以使用std::string
的.c_str()
或.data()
成员函数从 获取以 null 结尾的 C 字符串。
仅将原始指针用作非拥有指针。然后,您将永远不必决定是否需要delete
它。除了std::string
类之外,还有智能指针(如std::unique_ptr
(和容器(如std::vector
(,所有这些都将自动为您处理非数组和数组对象的所有权和正确delete
。