gpt4 book ai didi

c++ - 以下会不会引起内存问题?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:05:46 24 4
gpt4 key购买 nike

假设我在 DLL 实现中有以下内容(例如,它会有一个 cpp 文件):

class Base
{
protected:
Something *some;
public:
virtual void init()
{
some = new Something();
}

virtual ~Base()
{
delete some;
}

};

然后在我的 exe 文件中:

class Derived : public Base
{
public:
virtual void init()
{
some = new SomethingElse();
}
};

int main()
{
Base *blah = new Derived;
delete blah;
}

如果 DLL 在与 exe 不同的运行时运行,这会不会导致问题?

如果是,是否有非 boost、非 c++ 0x 的解决方案

谢谢

最佳答案

我认为你需要这样写 ~Derive()

~Derived()
{
delete some;
some = 0; //this is must; so that `delete some` in ~Base() works perfectly;
//note `delete (void*)0` is fine in C++!
}

解释:

为什么即使 ~Base() 做同样的事情(它看起来做同样的事情)你也需要写这个是因为 ~Derived () 确保您从创建它们的相同堆/内存池/等中删除您的对象。

查看这些主题:

How to use a class in DLL?
Memory Management with returning char* function


编辑:

更好的方法是再添加一个虚函数,比如 deinit(),(你的 virtual void init() 的对应部分),当您重新定义 init(),并在 deinit() 中执行取消分配。

//DLL
class Base
{
protected:
Something *some;
public:
virtual void init()
{
some = new Something();
}
virtual void deinit()
{
delete some;
}
virtual ~Base() { deinit(); }
};

//EXE
class Derived : public Base
{
public:
virtual void init()
{
some = new SomethingElse();
}
virtual void deinit()
{
delete some; //some=0 is not needed anymore!
}
};

关于c++ - 以下会不会引起内存问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4644489/

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