c ++:带有char *内存泄漏的字符串构造函数

时间:2014-07-02 13:00:42

标签: c++ string pointers memory-leaks

根据我的理解,当我们调用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;

在这种情况下是否需要删除?

1 个答案:

答案 0 :(得分:4)

cptr = "dynamic_string"

这会将char*值(一个地址)更改为指向字符串文字。字符串文字驻留在已组装文件的数据段中,不会动态分配。所以你不能delete

指定另一个地址的指针永远不会复制数据,您应该使用strncpy来有效地复制内容(或逐个设置字符)。