从 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?
我想知道是否有人可以帮我解决一些与独特指针混淆的问题.请考虑以下代码:
// 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.
我错过了什么?如果有人能填写我在这里发生的事情并确认或不赞成我的推测,我将非常感激