是否有任何内存泄漏?
const char * pname = "NAME";
char * temp = new char[strlen(Name) + 64];
sprintf(temp,"%s", pname);
delete [] temp; // is there any memory leaks because now length of temp is 4.
答案 0 :(得分:6)
删除(修改)字符串文字(pname
)是未定义的行为。
此外new/delete
,new []/delete[]
仅用于配对。
如果可以,建议使用std::string
,让std::string
为您管理内存分配/释放。
std::string pname("NAME");
std::string temp(pname);
std::cout << pname << std::endl;
答案 1 :(得分:4)
不,无论temp的尾随0是分配的内存,它仍然是初始strlen(Name) + 64
,因此删除释放整个内存块是正确的。
正如@billz指出你不应该释放pname。
答案 2 :(得分:3)
不会有任何内存泄漏。 sprintf
只会使用它所需的temp
字节,但是,最初创建的所有字节都将保持分配状态(即使有些未使用)。
对delete[] temp
的调用将取消分配所有最初分配的字节。
正如其他人指出的那样,不要释放pname
。您应该只针对分别使用delete
和delete[]
创建的指针调用new
和new[]
。
其他信息:
当你创建temp
时,new[]
在内存中分配了一个连续字节数组PLUS一个额外的(小)空间,它存储有关分配的信息(例如,分配的大小) 。当您调用delete[]
时,它检查了该信息并发现分配了strlen(Name)+64
个字节,因此它知道必须释放所有这些字节。你只使用了一小部分分配空间这一事实并没有什么不同。