gpt4 book ai didi

c++ - 动态分配时将 C++11 对象添加到列表?

转载 作者:可可西里 更新时间:2023-11-01 16:31:10 26 4
gpt4 key购买 nike

假设我有一个 X 类:

struct X
{
...
};

我有一个全局 vector V:

vector<X*> V;

当且仅当它是动态分配的(作为最完整的派生对象,而不是子对象)时,我想将 X 的新实例添加到 V:

int main()
{
X x; // not added to V
new X; // added to V

struct D : X {};
new D; // not added to V
}

有什么办法吗?也许通过某种方式重载/覆盖operator new

最佳答案

struct X {
public:
static void* operator new(std::size_t size) {
void* p = ::operator new(size);
if (size == sizeof(X))
V.push_back(static_cast<X*>(p));
}
static void operator delete(void* p, std::size_t size) {
if (size == sizeof(X))
V.erase(std::remove(V.begin(), V.end(), p), V.end());
::operator delete(p, size);
}
};

请注意,有时 V 的元素指向的内存还不是或不再是 X。用户有可能绕过这些功能,但他们必须尝试。

如果您有另一个继承 X 但具有相同大小的类(因此除了“空”基类之外没有其他子对象),例如 struct Y : public X {};,上面的代码会认为 new Y 正在分配一个 X。如果这是一个问题,您还需要向每个此类 Y 添加 operator newoperator void。我认为没有更通用的解决方案。

关于c++ - 动态分配时将 C++11 对象添加到列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16815845/

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