gpt4 book ai didi

c++ - 为什么我可以分配一个对象数组而不是将它们放在一个 vector 中?

转载 作者:行者123 更新时间:2023-11-28 03:35:22 26 4
gpt4 key购买 nike

我有一个类,我想包含我创建的东西的多个对象。现在有效的代码是:

process.h:

private:
myObj *data;

process.cc:

data = new myObj[10];

但是我想将一个值传递给构造函数,所以我尝试将它转换为 std::vector(在修改构造函数以获取值之后)。

process.h:

private:
std::vector<myObj> data;

process.cc:

for (int m=0; m<10; m++) data.push_back( myObj(1.2) );

当我尝试它在执行时崩溃

*** glibc detected *** ... corrupted double-linked list: ... ***

当我试图为我分配的其他数组释放一些内存时,gdb 中的回溯显示析构函数中出现错误。搜索没有显示任何明显的东西。我在 myObj 中使用了一些静态成员变量,这会是个问题吗?

最佳答案

您遇到了双重删除错误。考虑这个简单的例子:

struct Other {};

struct MyObj {
Other *p;

MyObj () : p(new Other) {}
~MyObj () { delete p; }
};

std::vector<MyObj> data;

data.push_back(MyObj());

被推送到 data 上的临时对象被正确存储。但是,由于它是临时的,因此在推送后立即销毁。这意味着,p 成员在临时对象被销毁时被删除,因此 vector 版本的拷贝具有悬空指针。当 vector 对象被销毁时,指针将被再次删除,导致堆损坏。您收到的错误消息来自 glibc 代码,提示导致的错误状态。

要解决此问题,应定义适当的复制构造函数,以将对象的所有权从临时对象传递到目标对象。三的规则说我们也应该定义赋值运算符。

struct MyObj {
mutable Other *p;

MyObj () : p(new Other) {}
MyObj (const MyObj &o) : p(o.p) { o.p = 0; }
~MyObj () { delete p; }
const MyObj & operator = (MyObj o) {
using namespace std;
swap(*this, o);
return *this;
}
};

当实例为const时,需要使用mutable才能修改p成员,而需要const是因为临时变量正在传递给复制构造函数。通过此更改,将项目插入 vector 工作正常。

更好的解决方案是定义 p 以使用 unique_ptr 代替。

struct MyObj {
std::unique_ptr<Other> p;

MyObj () : p(new Other) {}
};

此示例中不需要析构函数,因为默认析构函数将析构 p,这将导致 Other 实例被 unique_ptr 删除。

关于c++ - 为什么我可以分配一个对象数组而不是将它们放在一个 vector 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11058767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com