2013-07-17 48 views
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

没有通读该指南的整章内容?不好。 – 2013-07-17 22:39:51

+0

@KerrekSB已收藏。 – 2013-07-17 22:47:54

+8

您拼写了'std :: vector (8)'错误。 – Casey

回答

11

Y。 new []配对delete []free() ing导致未定义的行为。

+0

啊,我的不好。它似乎免费配对新的内置类型。 –

+9

@HaliangZhang不,它没有。 'new'与'delete','new []'与''''''和'malloc()','calloc()'和'realloc()'与'free()'配对。任何其他组合都是错误的。 – 2013-07-17 22:40:45

+2

另外,从你的代码中,在我看来,你期望'sizeof'运算符产生8个。它可能不会(除非你有足够的幸运来使用64位系统)。 [这是为什么。](http://c-faq.com/aryptr/index.html) – 2013-07-17 22:46:04

12

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

你可以用这个代替代码:

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

最后,我建议你使用一个内置的数据类型一样std::vectorstd::array。它们比标准的旧C数组多得多。

相关问题