使用std :: queue和shared_ptr?

Ube*_*ose 1 c++ stl std include shared-ptr

考虑以下代码:

#include <queue>
#include <memory>

std::shared_ptr<char> oneSharedPtr(new char[100]);

std::queue<std::shared_ptr<char>> stringQueue;
stringQueue.queue(oneSharedPtr);
Run Code Online (Sandbox Code Playgroud)

这导致了

error C2274: 'function-style cast' : illegal as right side of '.' operator
Run Code Online (Sandbox Code Playgroud)

为什么是这样?在队列中使用共享指针是否安全(共享指针的引用计数在弹出时是否会变为0)?

jua*_*nza 5

那是因为std :: queue没有queue方法.你可能会追求std::queue::push.

stringQueue.push(oneSharedPtr);
Run Code Online (Sandbox Code Playgroud)

注意:您在std::shared_ptr这里的使用是不正确的,因为您传递的是新的数组.有几种方法可以解决这个问题:

1)传递一个调用的删除器delete[]:

std::shared_ptr<char> oneSharedPtr(new char[100], 
                                   [](char* buff) { delete [] buff; } ); 
Run Code Online (Sandbox Code Playgroud)

2)使用类似于数组的类型delete:

std::shared_ptr<std::array<char,100>> oneSharedPtr1(new std::array<char,100>());
std::shared_ptr<std::vector<char>> oneSharedPtr2(new std::vector<char>);
std::shared_ptr<std::string> oneSharedPtr3(new std::string());
Run Code Online (Sandbox Code Playgroud)

3)使用 boost::shared_array

boost::shared_array<char> oneSharedArray(new char[100]);
Run Code Online (Sandbox Code Playgroud)