1

有内存泄漏吗?

    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.
4

3 回答 3

6

删除(修改)字符串文字(pname)是未定义的行为。另外new/delete,new []/delete[]只能成对使用。

std::string如果可以,建议使用,让我们std::string为您管理内存分配/释放。

  std::string pname("NAME");
  std::string temp(pname);
  std::cout << pname << std::endl;
于 2013-01-16T07:59:46.027 回答
4

不,无论 temp 的尾随 0 是分配的内存在哪里,它仍然是初始内存,strlen(Name) + 64因此删除释放了正确的整个内存块。

正如@billz 指出的那样,您不应该释放 pname。

于 2013-01-16T08:00:31.317 回答
3

不,不会有任何内存泄漏。sprintf只会使用temp它需要的字节,但是,最初创建的所有字节都将保持分配状态(即使有些未使用)。

然后调用delete[] temp将释放所有最初分配的字节。

正如其他人指出的那样,不要免费pname。您应该只在分别用和创建的指针上调用delete和。delete[]newnew[]

附加信息:

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

于 2013-01-16T08:06:06.057 回答