gpt4 book ai didi

c++ - 使用 std::shared_ptr 接收变量作为引用的优缺点是什么?

转载 作者:行者123 更新时间:2023-11-30 02:14:40 25 4
gpt4 key购买 nike

我只是想知道以下将在 func1 内部创建的指针变量传递给调用者 (func2) 的方法是否是执行此操作的正确方法。如果这是正确的,它会在 func2 返回时释放内存吗?如果这是个坏主意,那是为什么?

int & func1()
{
std::shared_ptr<int> d = std::make_shared<int>(50);
return *d;
}


void func2(){

int & dd = func1();

}

这是一个简化的代码。我假设 d 的大小很大(例如图像)。

添加:我意识到以下也有效。每种方法的优点缺点是什么?

std::shared_ptr<int> & func1()
{
std::shared_ptr<int> d = std::make_shared<int>(50);
return d;
}

void func2()
{
std::shared_ptr<int> & dd = func1();
}

最佳答案

这两个例子都不好。您不能使用任何一个 func1 的返回值,它们总是悬挂引用。

int & func1()
{
std::shared_ptr<int> d = std::make_shared<int>(50);
return *d;
} // d is the only owner when it is destroyed, *d is also deleted

std::shared_ptr<int> & func1()
{
std::shared_ptr<int> d = std::make_shared<int>(50);
return d;
} // d is destroyed here

I am assuming the size of d is huge

你错了。 d指向的对象的大小与d的大小无关,就像原始指针一样。

例如

#include <iostream>
#include <memory>

struct Huge
{
int data[100000];
};

int main()
{
std::cout << sizeof(int) << std::endl
<< sizeof(int*) << std::endl
<< sizeof(std::shared_ptr<int>) << std::endl
<< sizeof(std::unique_ptr<int>) << std::endl
<< sizeof(Huge) << std::endl
<< sizeof(Huge*) << std::endl
<< sizeof(std::shared_ptr<Huge>) << std::endl
<< sizeof(std::unique_ptr<Huge>) << std::endl;
}

for me结果在

4
8
16
8
400000
8
16
8

I realized that the following also works

如果通过作品,你的意思是“被 C++ 编译器接受”,那么是的。如果您使用返回的引用,它们都会导致未定义的行为,所以我会说它们绝对不起作用

关于c++ - 使用 std::shared_ptr 接收变量作为引用的优缺点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57371440/

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