1

我想创建一个函数,该函数将接受指向类实例的指针作为参数,然后将其删除。问题是我事先不知道它将删除什么。基本上我需要的是这样的:

void Foo(pointer* generic_pointer){
  //Some code here
  delete generic_pointer;
  //Some more code here
}

我想过使用 void* 但这显然是非常糟糕的编码,并导致混乱。

注意:我有一个基本上是循环的对象,当它结束时,我需要创建另一个(不同类的)对象,这也是一个循环,然后删除原始对象。使用 delete this 我无法启动所需的循环,所以我想我可以从第二个对象中删除它,但它可能从任何类型的对象开始,所以这是我唯一能想到的。关于如何做的任何其他建议?

4

5 回答 5

2

这是不可能的。运算符使用数据的delete类型来推断要调用的析构函数。如果类型是void*,它就不能推断出任何合理的东西。您可能想查看智能指针主题。

于 2013-02-28T11:21:32.353 回答
1

这是非常糟糕的,强制转换void*和传递会丢失所有类型信息,并且您最终会以比程序编译速度更快的速度进入 undefinedbehaviorland。

只需按照老式的方式进行操作并调用delete. 我看不出打电话Foo(something)过来有什么好处delete something

于 2013-02-28T11:20:18.033 回答
0

已经说过的智能指针。让智能指针代替你管理内存。尝试实现您自己的智能指针(仅适用于教育目的的您)。在互联网上你可以找到很多不同的想法和实现。

附言

我想过使用 void* 但这显然是非常糟糕的编码,并导致混乱。

你听起来像一个十字军)))C++中不仅有黑白。简单地说,有很多可能会错误地使用某些东西。实际上,为了看起来优雅,有些事情确实需要使用 void* 来实现,您应该在实现时对用户隐藏它们。

于 2013-02-28T11:56:40.217 回答
-1

模板?

template<typename T>
void Foo<T>(T* p) {
  delete p;
}
于 2013-02-28T11:19:43.640 回答
-1

您可以使用模板来实现这一点

template <class T>
void Foo(T* pointer){
//do your stuff
delete T;
}

当然,这可能并不适用于所有情况。

这里

于 2013-02-28T11:21:23.557 回答