gpt4 book ai didi

c++ - 在对象不再存在后,如何销毁与该对象关联的数据?

转载 作者:行者123 更新时间:2023-11-28 04:00:17 26 4
gpt4 key购买 nike

我正在创建一个将数据(例如 D)与对象(例如 O)相关联的类(例如 C)。当O被销毁时,O会通知C,它很快将不复存在了:( ...后来,当C觉得时机成熟时,C会放手属于O的东西,即D。

如果 D 可以是任何类型的对象,那么 C 能够执行“删除 D;”的最佳方式是什么?如果 D 是一个对象数组呢?

我的解决方案是让 D 从 C 知道的基类派生。时机成熟时,C 在指向基类的指针上调用 delete。

我也考虑过存储 void 指针并调用 delete,但我发现那是未定义的行为并且不会调用 D 的析构函数。我认为模板可能是一种新颖的解决方案,但我无法实现这个想法。

这是我目前为止对 C 的了解,减去了一些细节:


// This class is C in the above description. There may be many instances of C.
class Context
{
public:
// D will inherit from this class
class Data
{
public:
virtual ~Data() {}
};

Context();
~Context();

// Associates an owner (O) with its data (D)
void add(const void* owner, Data* data);

// O calls this when he knows its the end (O's destructor).
// All instances of C are now aware that O is gone and its time to get rid
// of all associated instances of D.
static void purge (const void* owner);

// This is called periodically in the application. It checks whether
// O has called purge, and calls "delete D;"
void refresh();

// Side note: sometimes O needs access to D
Data *get (const void *owner);

private:
// Used for mapping owners (O) to data (D)
std::map _data;
};

// Here's an example of O
class Mesh
{
public:
~Mesh()
{
Context::purge(this);
}

void init(Context& c) const
{
Data* data = new Data;

// GL initialization here

c.add(this, new Data);
}

void render(Context& c) const
{
Data* data = c.get(this);
}

private:
// And here's an example of D
struct Data : public Context::Data
{
~Data()
{
glDeleteBuffers(1, &vbo);
glDeleteTextures(1, &texture);
}

GLint vbo;
GLint texture;
};
};

附言如果您熟悉计算机图形学和 VR,我正在创建一个类,将对象的每个上下文数据(例如 OpenGL VBO ID)与其每个应用程序数据(例如顶点数组)分开并释放每个上下文在适当的时间(当匹配的渲染上下文是当前的)数据。

最佳答案

这个问题的要求比较模糊,所以很难给出一个好的具体答案。我希望以下内容有所帮助。

如果您希望数据在其所有者去世时立即消失,请让所有者将其删除(如果 C 实例需要知道,则通知 C)。如果您希望 C 在闲暇时进行删除,您的解决方案看起来不错。从数据派生在我看来是正确的做法。 (当然,~Data() 是虚拟的很重要,正如您所做的那样。)

如果 D 是对象数组怎么办?这个问题有两种解释。如果你的意思是 D 总是一个数组,让它成为一个指向数据的指针的数组(或 vector<>)。然后在 C::purge() 中遍历 vector 并删除对象。如果您的意思是 D 可以是对象数组但也可以是单个对象,则有两种方法。要么决定它始终是一个数组(可能大小为 1),要么它是一个单个对象(从数据派生),它可以是一个包装实际对象数组(或指向它们的指针)的类。在后一种情况下,包装类析构函数应该遍历数组并进行删除。请注意,如果您希望数组(或 vector<>)包含实际对象,而不是指向它们的指针(在这种情况下,您不必遍历数组并手动删除),那么您将有以下限制。 1. 数组中的所有对象都必须是相同的实际类型。 2. 您必须将数组声明为该类型。这将使您失去多态性的所有好处。

关于c++ - 在对象不再存在后,如何销毁与该对象关联的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1095378/

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