在c ++中删除对象

Sna*_*gon 0 c++ destructor delete-operator

我有一个带有Node的LinkedList,它有一个字段:

void* _data;
Run Code Online (Sandbox Code Playgroud)

现在,我想删除这些数据,但我不知道数据是原始的还是动态分配的对象.

所以,如果写:

~Node() {
  delete _node;
}
Run Code Online (Sandbox Code Playgroud)

并且数据是动态分配的对象,它会调用对象的析构函数还是会有内存泄漏?

那我怎么能做这个呢?

Alo*_*ave 7

不要那样做!

调用deletea void pointer未定义的行为.[参考下面]
未定义的行为意味着任何事情都可能发生,程序有时可能会崩溃或有时可能会工作,但您无法始终预测其行为,这是一种非常糟糕的编程方式.

当你正确地结束了与void*没有办法使delete运营商可以计算出需要调用,最终,导致未定义行为哪一类的析构函数.

那么我怎样才能做到这一点呢?
正如我所见,你有一个void*指针的意图是有一个通用的链接列表实现.为此目的,C++已经提供了模板化的通用链接列表std :: list,您可以使用它,因为重新发明轮子没有意义,标准链接列表实现很可能比任何自定义实现的版本更好通用链接列表.

如果您仍想拥有自己的链接列表版本.你应该实现一个通用的模板链接列表类,就像std :: list那样.

看看模板编程.


参考:
根据C++ 03标准第5.3.5/3节:

在第一个替代(删除对象)中,如果操作数的静态类型与其动态类型不同,则静态类型应为操作数的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.在第二种方法(删除数组)中,如果要删除的对象的动态类型与其静态类型不同,则行为未定义(FootNote 73).

脚注73)

这意味着无法使用void*类型的指针删除对象,因为没有void类型的对象