【发布时间】:2021-05-05 02:19:41
【问题描述】:
这是我想做的简化版本,它在调用 push_back 时崩溃,特别是在调用析构函数时。如果我删除析构函数的主体,它可以工作,但我想确保它被删除。我没有使用 calloc/free,而是尝试了 new/delete,结果相同。我在这里做错了什么?
#include <cstdlib>
#include <vector>
using namespace std;
class Buffer
{
public:
float *DATA;
Buffer(int length) {DATA = (float*) calloc (length,sizeof(float));};
virtual ~Buffer(){free (DATA);};
private:
};
int main(int argc, char** argv)
{
vector <Buffer> v;
for (int i =0; i<10; i++)
v.push_back(Buffer(1000));
return 0;
}
【问题讨论】:
-
Buffer不符合 rule-of-three。它需要。您对DATA = buffer.DATA的意图是什么?您意识到所做的只是将两个Buffer对象DATA成员连接到same 动态指针值?那么.. 谁真正拥有那个东西?我严重怀疑这是故意的,如果不是,最简单的方法:std::vector<float> DATA;并扔掉其余的手动动态疯狂。 -
感谢您的评论,我删除了复制构造函数,但问题仍然存在,错误是“double free or corruption (!prev)”
-
那是因为默认的 copy-ctor 会完全完成你的工作。您是否阅读the link I provided 的页面,然后考虑它的重要性?考虑开头的句子:“如果一个类需要用户定义的析构函数、用户定义的复制构造函数或用户定义的复制赋值运算符,那么几乎可以肯定这三个都需要。” - 嗯,你有一个自定义的析构函数,所以你可能需要一个 proper 自定义的 copy-ctor 和 copy-assignment 操作符。
-
谢谢,我做到了,我正在努力理解该信息,这并不明显,您能否为我的案例提供一个示例
-
该链接有每个场景的示例。
标签: c++ class vector push-back