根据我的理解,当我们调用string
ctor并char*
进行深度复制时,传递的char*
可以轻松删除构造函数调用string之后(是吗?),之后可以安全地使用新字符串。
char* cptr = new char[20];
cptr = "dynamic_cstring"; // will it make difference if i will use memset
std::cout << cptr << std::endl;
std::string str(cptr);
std::cout << str.c_str() << std::endl;
cptr = "another string"; // seems that string internal buffer is not pointing to cptr
std::cout << str.c_str() << std::endl;
delete[] cptr; // crashed at this line. why ?
当我使用char *初始化字符串时,如何防止内存泄漏?还是自动清理?如果我使用类似的东西怎么办?
cptr[0] = 's';
std::string str(cptr);
// cptr = "another string";
delete[] cptr;
在这种情况下是否需要删除?
答案 0 :(得分:4)
cptr = "dynamic_string"
这会将char*
值(一个地址)更改为指向字符串文字。字符串文字驻留在已组装文件的数据段中,不会动态分配。所以你不能delete
。
指定另一个地址的指针永远不会复制数据,您应该使用strncpy
来有效地复制内容(或逐个设置字符)。