Vij*_*jay 2 c++ pointers memory-management
在C++中,我们使用delete
operator来在大多数时间删除对象.
该delete
不会使指针值NULL.有什么方法可以自动实现吗?
例如
int *p = new int;
delete p; // this should deallocate object pointed by p
// and also initialized value of p = NULL
Run Code Online (Sandbox Code Playgroud)
Mat*_* M. 14
你的建议有两个问题.
虚假的安全感
你的建议会导致虚假的安全感.当然,标准保证如果你调用delete
空指针,它不会爆炸.但是,您忘记了一个小事实:没有一个指向您对象的指针.
int* p = new int(8);
int* q = p;
delete p; p = 0;
delete q; // Undefined Behavior
Run Code Online (Sandbox Code Playgroud)
因此,这种做法毫无用处.而且由于虚假的安全感比没有安全感差,我实际上强烈反对它.希望人们在应用delete
nilly-willy 之前会思考.
这将我们带到第二个问题
你不敢使用吗? delete
delete
应保留给智能指针或其他容器的实现者.以下适用:
*对于您正在尝试实现的目标,可能已经存在已调试的实现.
有大量现有工具来管理内存:
std::unique_ptr
或者std::auto_ptr
(取决于你的C++版本)std::scoped_ptr
,std::shared_ptr
(和它的comparse std::weak_ptr
,或者它们的boost/tr1等价物)boost::array
,boost::scoped_array
,std::vector
(和共)boost::ptr_vector
和co)boost::intrusive_ptr
至和Boost Intrusive Containers库或Boost MultiIndex库(带有BiMap衍生物)有了这样一个异类的野生动物,很难想象你突然发现了一种新的方式来使用与我们所做的完全不同的数据.如果您有,请随时发布,我们将帮助您了解如何使用这些工具来适应您的情况(或指导您如何创建新形式的智能指针).
无论如何,这并没有多大帮助,因为指向被删除对象的指针可能不止一个。
int* p = new int;
int* q = p;
delete p; // how do we NULL q?
Run Code Online (Sandbox Code Playgroud)
最好的想法是在p超出范围之前使用delete。或使用标准容器,因此我们根本不需要新的/删除的容器。