gpt4 book ai didi

C++11 将多个共享指针存储为原始指针

转载 作者:IT老高 更新时间:2023-10-28 22:19:53 26 4
gpt4 key购买 nike

我的问题涉及 C++11 中的 shared_ptrmake_shared。我有两个 vector ,第一个存储智能指针,第二个存储原始指针。第一个 vector 按我的预期工作,但 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;
}


输出

vector1 values:
1
2
3
vector2 values:
6
6
6


问题

我意识到创建原始指针而不是尝试转换智能指针会简单得多,但这让我很想知道为什么会发生这种情况?还有为什么每次推送都会改变vector2中的所有值?


链接

以下是我在 stackoverflow 中发现的一些问题,但他们没有回答我的问题,或者我可能不明白答案...

最佳答案

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

这是一项功能。您希望发生这种情况:否则,您将泄漏内存。想象一下这段代码:

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

如果内存没有被释放,那么之后将没有办法释放它,因为你无法恢复 shared_ptr 的托管指针。

关于C++11 将多个共享指针存储为原始指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23529192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com