有内存泄漏吗?
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.
有内存泄漏吗?
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.
删除(修改)字符串文字(pname
)是未定义的行为。另外new/delete
,new []/delete[]
只能成对使用。
std::string
如果可以,建议使用,让我们std::string
为您管理内存分配/释放。
std::string pname("NAME");
std::string temp(pname);
std::cout << pname << std::endl;
不,无论 temp 的尾随 0 是分配的内存在哪里,它仍然是初始内存,strlen(Name) + 64
因此删除释放了正确的整个内存块。
正如@billz 指出的那样,您不应该释放 pname。
不,不会有任何内存泄漏。sprintf
只会使用temp
它需要的字节,但是,最初创建的所有字节都将保持分配状态(即使有些未使用)。
然后调用delete[] temp
将释放所有最初分配的字节。
正如其他人指出的那样,不要免费pname
。您应该只在分别用和创建的指针上调用delete
和。delete[]
new
new[]
附加信息:
创建时temp
,new[]
在内存中分配了一个连续字节数组,外加一个额外的(小)空间,用于存储有关分配的信息(例如,分配的大小)。当您调用delete[]
它时,它检查了该信息并发现strlen(Name)+64
已分配字节,因此它知道必须释放所有字节。您只使用了分配空间的一小部分这一事实并没有什么不同。