2

我有以下代码:

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++ 字符串有什么特别之处吗?

4

2 回答 2

12

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

你可以用这个替换你的代码:

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

最后,我建议您使用内置数据类型,例如std::vectoror std::array。它们比标准的旧 C 数组更接近 C++。

于 2013-07-17T22:39:45.203 回答
11

是的。new []delete []. free()ing 导致未定义的行为。

于 2013-07-17T22:39:28.860 回答