相关疑难解决方法(0)

为什么没有std :: shared_ptr <T []>专门化?

该标准提供了一个模板特化std::unique_ptr,正确调用delete[]其析构函数:

void func()
{
   std::unique_ptr< int[] > arr(new int[10]);

   .......
}
Run Code Online (Sandbox Code Playgroud)

由于std::shared_ptr这种专业化不可用,因此有必要提供一个正确调用的删除器delete[]:

void func()
{
    // Usage
    shared_ptr array (new double [256], [](double* arr) { delete [] arr; } ); 

    ..............
}
Run Code Online (Sandbox Code Playgroud)

这只是一个疏忽吗?(以同样的方式存在std::copy_if)或是否有原因?

c++ shared-ptr c++11

64
推荐指数
1
解决办法
9851
查看次数

从unique_ptr <T []>初始化shared_ptr <T>

[跟进这个问题]

最近,我一直在处理一些关于c风格数组的智能指针.我最终做了推荐的事情,并使用智能指针代替向量,但在那段时间,我得到了一些建议:不要使用shared_ptr<T>对象来管理最初制作的数组,make_unique<T[]>因为它不会调用delete[]而是delete.

这对我来说似乎不合逻辑,我检查了Coliru和标准:


这段代码:

#include <iostream>
#include <memory>

int main()
{
    std::cout << "start!\n";
    auto customArrayAllocator = [](unsigned int num){
        std::cout << "custom array allocator\n";
        return new int[num];
    };

    std::cout << "allocator constructed\n";

    auto customArrayDeleter = [](int *ptr){
        std::cout << "custom array deleter\n";
        delete[] ptr;
    };

    std::cout << "deleter constructed\n";

    std::unique_ptr<int[], decltype(customArrayDeleter)>
        myUnique(customArrayAllocator(4), customArrayDeleter);

    std::cout << "unique_ptr constructed\n";

    std::shared_ptr<int>
        myShared = std::move(myUnique);

    std::cout << "shared_ptr constructed\n";
}
Run Code Online (Sandbox Code Playgroud)

产生这个输出: …

c++ shared-ptr unique-ptr c++14

9
推荐指数
1
解决办法
1052
查看次数

标签 统计

c++ ×2

shared-ptr ×2

c++11 ×1

c++14 ×1

unique-ptr ×1