gpt4 book ai didi

c++ - 为什么 unique_ptr 为空?

转载 作者:太空狗 更新时间:2023-10-29 23:39:47 25 4
gpt4 key购买 nike

在下面的代码片段中,foo 中的断言总是会触发。

谁能解释为什么 ynullptr?这看起来像是一个终身问题,即 y 在调用 putget 之间被破坏,但我真的不明白为什么。

我错过了什么?

TIA

class Y
{
public:
Y(const std::string& name) : m_name(name)
{
}

const std::string& getName() const
{
return m_name;
}

private:
Y(const Y&);

const std::string m_name;
};

void foo(std::unique_ptr<Y> y)
{
if (y == nullptr)
{
// ALWAYS FIRES
assert(false && "nullptr\n");
}

std::string name = y->getName();
std::cout << "name: " << name << "\n";
}

class X
{
public:
X() {}

void put(std::unique_ptr<Y> y)
{
m_queue.push([&] { foo(std::move(y)); });
}

void get()
{
std::function<void()> func = m_queue.front();
func();
}

private:
std::queue<std::function<void()>> m_queue;
};


int main()
{
std::unique_ptr<Y> y(new Y("fred"));
X x;
x.put(std::move(y));
x.get();
return 0;
}

最佳答案

void put(std::unique_ptr<Y> y)
{
m_queue.push([&] { foo(std::move(y)); });
}

在此函数中,y 是一个局部变量,当它超出范围时会被销毁。局部变量被 lambda 捕获(通过引用),在执行时不存在——它指向空/空/垃圾/任何东西,如 y 已经被销毁了。

关于c++ - 为什么 unique_ptr 为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29610147/

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