在C++中,我们使用delete
运算符来大部分时间删除对象。删除后将C++指针初始化为零?
delete
不使指针值为NULL。有什么办法可以自动实现?
例如
int *p = new int;
delete p; // this should deallocate object pointed by p
// and also initialized value of p = NULL
在C++中,我们使用delete
运算符来大部分时间删除对象。删除后将C++指针初始化为零?
delete
不使指针值为NULL。有什么办法可以自动实现?
例如
int *p = new int;
delete p; // this should deallocate object pointed by p
// and also initialized value of p = NULL
它是简单写一个这样的:
template<class T>
void safe_delete(T*& p)
{
delete p;
p = NULL;
}
int main()
{
int* p = new int;
safe_delete(p);
double* p1 = new double;
safe_delete(p1);
}
要小心,不要使用数组使用这个虽然:)
你可以编写自己的包装函数或宏来做到这一点。 但是,在一般情况下很难,因为您可以将rvalue传递给删除操作符。那么它应该给NULL分配什么?
对不起,但我无法理解你的陈述*你可以将右值传递给删除操作符*,你能详细说明一下吗?你怎么能通过一个右值来删除? – liaK 2011-03-24 07:12:16
'delete(new int(42));' – 2011-03-24 07:17:43
实际上,右值问题可以通过使用右值引用在C++ 0x中解决......使用右值,您肯定不需要无效。 – 2011-03-24 07:33:22
你可以编写自己的函数来做到这一点:
void deleteAndReset (void** p)
{
delete *p;
*p = null;
}
没有任何测试的任何,我给你这个:
template <typename T> void deleteAndNull(T *&pointer){
delete pointer;
pointer = 0;
}
'T *&指针'?或者这个'T&指针'? – Nawaz 2011-03-24 06:06:46
实际上我不确定语法,但我希望它是对指针的引用。我不确定,但我认为这将阻止尝试删除不是指针的东西 – Bwmat 2011-03-24 06:10:20
@Nawaz:在这种情况下无关紧要::) – ybungalobill 2011-03-24 06:23:35
做到这将是无视操作最简单的方法删除对
阅读有关运算符重载,是我的建议。 这样,您可以保留所有当前的代码,而无需经过努力将所有内容都改为函数调用。
您不能覆盖'delete'运算符,只能'运算符delete'。 – fredoverflow 2011-03-24 07:36:21
谢谢 - 改变它 – Prime 2011-06-06 23:10:54
无论如何,这并没有多大帮助,因为可能有多个指向已删除对象的指针。
int* p = new int;
int* q = p;
delete p; // how do we NULL q?
最好的办法是使用删除p超出范围之前。或者使用标准容器,所以我们根本不需要新建/删除。
相同的答案您的其他指针的问题 - 使用smart pointer。重新发明轮子没有意义。
可能是一个使用auto_ptr指针将alos保存您的时间。
这样做是非常糟糕的做法。
他们表示,如果存在双重删除,它将保存程序免于崩溃。 唉,在删除它指向的对象之后使指针为NULL,只是掩盖了问题:您的程序包含错误。
我向你保证,你希望你的程序在这种情况下尽可能早地尽可能大声地崩溃。
您的建议有两个问题。
安全
你的建议的错觉引发安全的错觉。当然,标准保证,如果你在空指针上调用delete
,它不会炸毁。但是,你忘记了一个小事实:没有一个指向你的对象的指针。
int* p = new int(8);
int* q = p;
delete p; p = 0;
delete q; // Undefined Behavior
因此,这种做法是没用的。而且因为一个虚假的安全感比差不多安全的差,我其实非常反感。希望人们在申请delete
之前先考虑一下。
这给我们带来的第二个问题
你从来不敢使用delete
delete
应保留至智能指针或其他容器实施者。以下适用:
* 有可能是你想达到什么样的一个已经存在的调试实现。
有堆现有的工具来管理内存:
std::unique_ptr
或std::auto_ptr
(取决于你的C++版本),std::scoped_ptr
,std::shared_ptr
(及其comparse std::weak_ptr
,或它们的升压/ TR1当量)boost::array
,boost::scoped_array
,std::vector
(和共)boost::ptr_vector
(和CO)boost::intrusive_ptr
和升压介入式容器库或Boost的多指标库(与BIMAP衍生物)有了这样的异类野生动物,很难认为你突然发现使用的数据是从我们做什么,你就需要别的东西完全不同的新方法。如果您有,请随时发布,我们将帮助您了解如何使用这些工具来适应您的情况(或为您提供关于如何创建新形式的智能指针的指示)。
你为什么认为这是一个好主意?搜索其他问题和/或谷歌它,你会看到,它不是很清楚,这不会实际上隐藏代码中的错误(双删除,其中第二个删除*被忽略*因为指针先前设置为0) – 2011-03-24 08:34:21