动态分配的字符串数组无法解除分配

时间:2013-07-17 22:37:21

标签: c++

我有以下代码:

string * p = new string[8];
cout<<sizeof(p)<<endl;
free(p);

这对我来说似乎没问题但是失败了:

8
a.out(85837) malloc: *** error for object 0x7fb5b3403ae8: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

对整数数组的另一个测试工作。 c ++字符串有什么特别之处吗?

2 个答案:

答案 0 :(得分:12)

首先,当您使用new时,您需要使用delete,而不是free()。实际上,你真的不应该在C ++中使用free()malloc()。关于为什么你永远不应该混合newfreemalloc()并删除的一个很好的解释是newdelete调用构造函数和析构函数{{1与free()无关,它们只是分配和释放内存,特别是对于内置类,这很糟糕,因为你不知道在malloc()的析构函数中应该发生什么或构造函数,它可能使它适用于您自己的内置类(但不要这样做)。

您可以使用以下代码替换代码:

std::string

最后,我建议您使用内置数据类型,例如string * p = new string[8]; cout<<sizeof(p)<<endl; delete [] p; std::vector。它们比标准的旧C数组更加C ++。

答案 1 :(得分:11)

邑。 new []delete []成对。 free()导致未定义的行为。