我有以下代码:
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 ++字符串有什么特别之处吗?
答案 0 :(得分:12)
首先,当您使用new
时,您需要使用delete
,而不是free()
。实际上,你真的不应该在C ++中使用free()
或malloc()
。关于为什么你永远不应该混合new
和free
或malloc()
并删除的一个很好的解释是new
和delete
调用构造函数和析构函数{{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()
导致未定义的行为。