使用std :: queue和shared_ptr?

时间:2013-06-05 09:17:34

标签: c++ stl include std shared-ptr

考虑以下代码:

#include <queue>
#include <memory>

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

std::queue<std::shared_ptr<char>> stringQueue;
stringQueue.queue(oneSharedPtr);

这导致

error C2274: 'function-style cast' : illegal as right side of '.' operator

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

2 个答案:

答案 0 :(得分:5)

这是因为std::queue没有queue方法。你可能在std::queue::push之后。

stringQueue.push(oneSharedPtr);

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

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

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

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());

3)使用boost::shared_array

boost::shared_array<char> oneSharedArray(new char[100]);

答案 1 :(得分:0)

你是说

吗?
#include <queue>
#include <memory>

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

std::queue<std::shared_ptr<char>> stringQueue;
stringQueue.push(oneSharedPtr);
}

std::queue没有queue方法。例如,使用this来检查可用的内容:d

http://ideone.com/dx34N8