gpt4 book ai didi

c++ - std::vector 在重新分配时无论如何调用包含对象的析构函数?

转载 作者:行者123 更新时间:2023-11-30 02:27:17 34 4
gpt4 key购买 nike

每当我的对象的 vector 被重新分配时,对象的析构函数就会被调用,这会给我带来问题。

struct Object
{
Object(int buffer_ID) : buffer_ID(buffer_ID){ OpenGLCreateBuffer(buffer_ID, somedata);}
~Object() { OpenGLDeleteBuffer(buffer_ID); }
int buffer_ID;
};

int main()
{
std::vector<Object> objArr;
objArr.push_back(1);
objArr.push_back(2); // Destructor is called when reallocating vector

OpenGLDrawBuffer(objArr[0].buffer_ID); // The buffer has been deleted

}

这真的很烦人,我不明白为什么要对正在移动的对象调用析构函数。我环顾四周,我很满意你不能阻止析构函数被调用。对于移动语义,我认为使用的技巧是从另一个对象复制内容,并将任何指针设置为 null,这样当对它们调用析构函数并释放资源时,只会对 nullptr 调用 delete。

我首先尝试制作一个复制构造函数,并尝试将另一个 buffer_ID 设置为 0,但这仅在复制构造函数采用非常量引用时有效,这似乎不正确。此外,将其他变量设置为 null 以便随后在 null 上调用 delete 的行为,或者将 null 传递给类似于本例中的 OpenGL delete 函数的行为,似乎很老套,不是吗?

我知道我会被告知我无法阻止析构函数被调用,那么在对象可能被重新分配到另一部分的情况下我该怎么办?我认为析构函数是删除此类内容的最佳位置。

谢谢。

最佳答案

你的类(class)出现在violate the Rule Of Three .它的析构函数似乎要销毁不是在其构造函数中创建的资源。

您真正的问题是您的类的基本设计与 std::vector 的工作方式不兼容。当 vector 必须重新分配其内容时,它会复制构造或移动构造(如果 vector 的类支持移动语义)现有实例,然后销毁所有旧类实例。这就是 vector 的工作原理。这就是它的设计方式。如果你的类不能那样工作,你就不能使用 std::vector。使用 std::list 可能是一种选择。

但更好的选择是修正你的类(class)。重新设计,使其符合三规则。这样做之后,进一步扩展您的类以添加一个移动构造函数,并适当支持移动语义。

关于c++ - std::vector 在重新分配时无论如何调用包含对象的析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41864544/

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