【问题标题】:dynamically allocated string arrays failed to be deallocated动态分配的字符串数组未能被释放
【发布时间】:2013-07-16 16:42:51
【问题描述】:

我有以下代码:

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

【问题讨论】:

  • 没有通读该指南中的整个章节?不好。
  • @KerrekSB 已收藏。
  • 你拼错了std::vector&lt;string&gt;(8)

标签: c++


【解决方案1】:

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

【讨论】:

  • 啊,我的错。对于内置类型,它似乎与新的免费配对。
  • @HailiangZhang 不,它没有。 newdelete 配对,new []delete []malloc() 配对,calloc()realloc()free() 配对。任何其他组合都是错误的。
  • 另外,从您的代码来看,在我看来,您希望 sizeof 运算符产生 8。它可能不会(除非您 [un] 幸运地使用 64-位系统)。 This is why.
  • 大声笑,我想确保我的更高,直到他接受答案
【解决方案2】:

首先,当你使用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 数组更接近 C++。

【讨论】:

    猜你喜欢
    • 2014-02-23
    • 2012-01-08
    • 2017-04-12
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    相关资源
    最近更新 更多