如果我调用std::make_shared<T>(而不是仅仅shared_ptr<T>显式分配),那么出于性能原因,我希望引用计数在T的实例旁边分配.一切都很好.
但是如果我有weak_ptr引用相同对象的实例,可能他们需要访问该引用计数,以了解该对象是否仍然存在.
因此,当T的实例的最后一个shared_ptr被销毁时,对系统的天真理解意味着它不能释放存储T的内存,因为weak_ptrs仍然需要访问该计数.
似乎有一个单独的弱引用计数器,理论上它可以与T的实例分开保存,这样T可以被破坏,内存释放,而弱引用仍然存在.但后来我们又回到了两个单独的分配,挫败了它的好处make_shared.
我想我在这里误解了一些东西.std::make_shared当存在弱引用时,如何释放为构造的实例分配的内存?
我的问题shared_ptr与make_sharedC++ 11有关.我有两个向量,第一个存储智能指针,第二个存储原始指针.第一个向量就像我已经过了一样,但是vector2只是令人困惑......
#include <iostream>
#include <vector>
#include <memory>
int main() {
std::vector<std::shared_ptr<int>> vector1;
vector1.push_back(std::make_shared<int>(1));
vector1.push_back(std::make_shared<int>(2));
vector1.push_back(std::make_shared<int>(3));
std::vector<int*> vector2;
vector2.push_back(std::make_shared<int>(4).get());
vector2.push_back(std::make_shared<int>(5).get());
vector2.push_back(std::make_shared<int>(6).get());
std::cout << "vector1 values:" << std::endl;
for(auto &value: vector1) { std::cout << *value << std::endl; }
std::cout << "vector2 values:" << std::endl;
for(auto &value: vector2) { std::cout << *value << std::endl; }
return 0;
}
Run Code Online (Sandbox Code Playgroud)
vector1 values:
1
2
3
vector2 values:
6
6
6
Run Code Online (Sandbox Code Playgroud)
我意识到创建原始指针并且不尝试转换智能指针会更简单但是让我很好奇知道为什么会发生这种情况?另外为什么每次推送都会改变vector2中的所有值?
以下是我在stackoverflow中发现的一些问题,但他们没有回答我的问题,或者我不明白答案......
我正在尝试编写一个派生自定义的STL分配器std::allocator,但不知何故所有调用都要allocate()转到基类.我把它缩小到这段代码:
template <typename T> class a : public std::allocator<T> {
public:
T* allocate(size_t n, const void* hint = 0) const {
cout << "yo!";
return 0;
}
};
int main()
{
vector<int, a<int>> v(1000, 42);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我期待"哟!" 打印,然后是一些可怕的错误,因为我实际上没有分配任何东西.相反,该程序运行良好,并没有打印.我究竟做错了什么?
我在gcc和VS2008中得到了相同的结果.
我刚刚开始使用,boost::shared_ptr所以我一直在搜索,我发现有几种方法可以初始化它:
boost::shared_ptr<MyClass> myclass = boost::shared_ptr<MyClass>(new MyClass());
boost::shared_ptr<MyClass> myclass = new MyClass();
boost::shared_ptr<MyClass> myclass = boost::make_shared<MyClass>();
Run Code Online (Sandbox Code Playgroud)
分配它:
boost::shared_ptr<MyClass> someOtherType::getMyClass();
boost::shared_ptr<MyClass> myclass = someOtherTypePointer->getMyClass();
boost::shared_ptr<MyClass> myclass = boost::make_shared<MyClass>(someOtherTypePointer->getMyClass());
Run Code Online (Sandbox Code Playgroud)
哪一个是init/assign的首选方式,为什么?
谢谢.