C++ - 确定 const char* 是指向字符串文本对象还是动态对象


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

相关内容

最新更新