Mut*_*key 2 c++ new-operator unique-ptr visual-c++ c++11
我想知道是否有人可以帮我解决一些与独特指针混淆的问题.请考虑以下代码:
// some class "complex" defined here
int main()
{
while(1)
{
unique_ptr<complex> p(new complex[256]);
p.reset();
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,当我调用reset()唯一指针时,它应该删除其原始指针所引用的对象.在这种情况下,对象碰巧是complex256个创建的第一个类型的对象.因为那是什么new complex[256],我是对的吗?它只是返回一个指向数组中第一个对象的指针(它当然也会创建)?所以256个对象的其余部分应保持不变.
遵循该逻辑,无限循环应该创建内存泄漏,但这不会发生.我正在使用MS Visual Studio 2013.
我错过了什么?如果有人能填写我在这里发生的事情并确认或不赞成我的推测,我将非常感激
Pra*_*ian 10
当它超出范围时,你unique_ptr将调用delete它拥有的指针.所以你要删除new[]使用delete而不是使用分配的内存delete[].这是未定义的行为,并且试图进一步推断为什么你的代码没有按照你期望的方式行事,这几乎是毫无意义的.
但是可能发生的事情是调用delete指针意味着只有complex数组中的第一个对象被销毁(意味着它的析构函数被调用).不会为剩余的255个对象调用析构函数,但仍会释放整个数组占用的内存.
我认为你的期望是你的程序使用越来越多的内存,最后在new分配失败时死掉,但如果数组占用的内存被释放,那就永远不会发生.
使用a处理数组的正确方法unique_ptr是使用数组类型的部分特化
unique_ptr<complex[]> p(new complex[256]);
// ^^
Run Code Online (Sandbox Code Playgroud)
或者,如果您的标准库实现std::make_unique(C++ 14),那么使用
auto p = std::make_unique<complex[]>(256);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
985 次 |
| 最近记录: |