小编Mut*_*key的帖子

处理数组时 make_unique 和 make_shared 之间的差异

从 C++17 开始,您可以使用它make_unique来创建指向数组的智能指针,例如:

unique_ptr<int[]> ptr = make_unique<int[]>(10);
Run Code Online (Sandbox Code Playgroud)

这将创建一个指向 10 个元素的数组的智能指针(事实上,将调用正确的 deleter[] 也很棒)。

然而,根据this make_shared不支持这样的功能(至少在 C++17 中不支持,据我所知):

shared_ptr<int[]> ptr = make_shared<int[]>(10);
Run Code Online (Sandbox Code Playgroud)

上面的代码显然是非法的。事实上,我的 Visual Studio 2017 (v141) 吐出了以下错误:

C2070: 'int[]': illegal sizeof operand'
Run Code Online (Sandbox Code Playgroud)

有趣的是,shared_ptr它本身确实支持数组类型(即shared_ptr<int[]>合法,但make_shared又不支持。然而make_unique确实如此。

问题是,是什么阻止了标准制定者支持make_shared数组类型,就像 的情况一样make_unique

c++ smart-pointers make-shared

6
推荐指数
1
解决办法
6009
查看次数

独特的指针内存泄漏

我想知道是否有人可以帮我解决一些与独特指针混淆的问题.请考虑以下代码:

// 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.

我错过了什么?如果有人能填写我在这里发生的事情并确认或不赞成我的推测,我将非常感激

c++ new-operator unique-ptr visual-c++ c++11

2
推荐指数
1
解决办法
985
查看次数