关于c ++:C ++ 11存储多个共享指针作为原始指针

C++11 storing multiple shared pointers as raw pointers

我的问题涉及C++ 11中的EDOCX1·0和make_shared。我有两个向量,第一个向量存储智能指针,第二个向量存储原始指针。第一个向量的工作原理和我预期的一样,但是向量2只是令人困惑…

代码样本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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;
}

< BR>

产量

1
2
3
4
5
6
7
8
vector1 values:
1
2
3
vector2 values:
6
6
6

< BR>

问题

我意识到,开始创建原始指针会更简单,而不是试图转换智能指针,但这让我好奇为什么会发生这种情况?为什么每次推送都会改变矢量中的所有值?

< BR>

链接

以下是我在StackOverflow中发现的一些问题,但它们没有回答我的问题,或者我可能不理解答案…

  • 原始指针参数的共享指针
  • 使用make_shared创建共享的_ptr有什么缺点吗?
  • C++原始指针和STD::
  • 从共享指针提取原始指针


使用shared_ptr的原因是,当指向它的所有实例都超出范围时,希望释放它所指向的内存。在调用.get()后,shared_ptr立即被销毁,因此立即有一个悬空指针。取消引用操作的结果未定义,这意味着它可能返回或可能不返回有意义的值,或者它甚至可以执行完全无关的操作(如崩溃)。

这是一个功能。你希望这发生:否则,你会泄露内存。想象一下这个代码:

1
2
vector<int> integers;
integers.push_back(*make_shared<int>(6).get());

如果内存没有释放,那么以后就没有办法释放它了,因为您无法恢复共享指针的托管指针。


你看到的是未定义的行为。当你这样做的时候:

1
vector2.push_back(std::make_shared<int>(4).get());

您正在创建一个临时的shared_ptr,并将指向其托管对象的指针复制到您的vector中。这将立即成为悬空指针。