字符数组中的null是否会阻止内存被删除?

时间:2013-01-16 07:58:00

标签: c++

是否有任何内存泄漏?

    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.

3 个答案:

答案 0 :(得分:6)

删除(修改)字符串文字(pname)是未定义的行为。 此外new/deletenew []/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。您应该只针对分别使用deletedelete[]创建的指针调用newnew[]

其他信息:

当你创建temp时,new[]在内存中分配了一个连续字节数组PLUS一个额外的(小)空间,它存储有关分配的信息(例如,分配的大小) 。当您调用delete[]时,它检查了该信息并发现分配了strlen(Name)+64个字节,因此它知道必须释放所有这些字节。你只使用了一小部分分配空间这一事实并没有什么不同。