C++ 使用std::queue和共享的ptr?

C++ 使用std::queue和共享的ptr?,c++,stl,include,std,shared-ptr,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); 为什么会这样?在队列中使用共享指针安全吗?共享指针的引用计数在pop上是否会变为0?

考虑以下代码位:

#include <queue>
#include <memory>

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

std::queue<std::shared_ptr<char>> stringQueue;
stringQueue.queue(oneSharedPtr);
为什么会这样?在队列中使用共享指针安全吗?共享指针的引用计数在pop上是否会变为0?

这是因为没有队列方法。您可能正在使用std::queue::push

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

1传递调用delete[]的删除程序:

3使用

这是因为没有队列方法。您可能正在使用std::queue::push

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

1传递调用delete[]的删除程序:

3使用

你是说

#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没有队列方法。例如,使用always检查可用的内容:d

你是说

#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没有队列方法。例如,使用always检查可用的内容:d


在这种情况下,未正确使用共享ptr。它将调用delete ptr;而不是删除[]ptr;。你可以用一个简单的字符串替换你的字符数组…@JBL这是一个人为的例子。我实际上需要在内存中存储一个句柄到一个非空终止的缓冲区。如果需要调用数组delete,应该如何处理这种情况?把它放在std::vector中?@JBL看起来像是std::shared\u ptr的数组删除替换。谢谢你发现了这一点。只是为了完成。将std::shared_ptr转换为std::vector也可以达到同样的效果。您可以尝试使用std::string及其成员函数。您也可以使用from Boost.shared\u ptr在这种情况下使用不正确。它将调用delete ptr;而不是删除[]ptr;。你可以用一个简单的字符串替换你的字符数组…@JBL这是一个人为的例子。我实际上需要在内存中存储一个句柄到一个非空终止的缓冲区。如果需要调用数组delete,应该如何处理这种情况?把它放在std::vector中?@JBL看起来像是std::shared\u ptr的数组删除替换。谢谢你发现了这一点。只是为了完成。将std::shared_ptr转换为std::vector也可以达到同样的效果。您可以尝试使用std::string及其成员函数。您也可以使用来自Boost的。我将穿这件衣服。我没有检查医生的过错。pop上的ref计数如何?@UberMongoose ref计数将减少,这并不奇怪。但看看JBL的评论。这很重要。@UberMongoose我为boost::shared_array.Right添加了一个示例。我将穿这件衣服。我没有检查医生的过错。pop上的ref计数如何?@UberMongoose ref计数将减少,这并不奇怪。但看看JBL的评论。这很重要。@UberMongoose我为boost::shared_array添加了一个示例。@restart.localhost.localdon谢谢…:@restart.localhost.localdon谢谢…:
std::shared_ptr<char> oneSharedPtr(new char[100], 
                                   [](char* buff) { delete [] buff; } ); 
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());
boost::shared_array<char> oneSharedArray(new char[100]);
#include <queue>
#include <memory>

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

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