gpt4 book ai didi

c++ - 为什么我会丢失这些带有智能指针的构造对象,而不是新对象?

转载 作者:行者123 更新时间:2023-11-30 02:19:06 26 4
gpt4 key购买 nike

我想我对智能指针有一些误解。看看下面的例子。当我使用 new/* 时,我得到的正是我所期望的,但是当我使用 std::shared_ptr 时,我得到一个空指针错误。智能指针的实现不就和我用new/*做的一样吗?

此外,我能否调整 AnotherGiver 以避免许多指针取消引用?

#include <memory>
#include <iostream>
class numGiver
{
public:
virtual int giveNum(void) = 0;
virtual int othNum(void) = 0;
};


class constGiver : public numGiver
{
public:
int giveNum(void)
{
return 5;
}
int othNum(void)
{
return 5;
}
};


class othAddGiver : public numGiver
{
public:
int giveNum(void)
{
return myNum + ng->giveNum();
}
int othNum(void)
{
return ng->othNum();
}
othAddGiver(std::shared_ptr<numGiver> ng, int num) : ng(ng), myNum(num) {};
private:
std::shared_ptr<numGiver> ng;
int myNum;
};

class AnotherGiver : public numGiver
{
public:
int giveNum(void)
{
return myNum + ng->giveNum();
}
int othNum(void)
{
return ng->othNum();
}
AnotherGiver(numGiver* ng, int num) : ng(ng), myNum(num) {};
private:
numGiver* ng;
int myNum;
};


int main()
{
std::shared_ptr<numGiver> ng = std::make_shared<constGiver>();
std::shared_ptr<numGiver> og;
numGiver* anotherGiver = 0;
for (int i = 0; i < 25; ++i)
{
if (i == 0)
{
anotherGiver = new AnotherGiver(&*ng, 3);
std::shared_ptr<numGiver> og = std::make_shared<othAddGiver>(ng, 3);
}
else
{

anotherGiver = new AnotherGiver(anotherGiver, 3);
std::shared_ptr<numGiver> og = std::make_shared<othAddGiver>(og, 3);
}

}
std::cout << anotherGiver->giveNum() << std::endl;
std::cout << anotherGiver->othNum() << std::endl;
std::cout << og->giveNum() << std::endl;
std::cout << og->othNum() << std::endl;
return 0;
}

最佳答案

您正在隐藏外部范围的 og与定义

std::shared_ptr<numGiver> og = std::make_shared<othAddGiver>(ng, 3);

std::shared_ptr<numGiver> og = std::make_shared<othAddGiver>(og, 3);

如果删除 std::shared_ptr<numGiver>从这些行来看,它 works fine.

关于c++ - 为什么我会丢失这些带有智能指针的构造对象,而不是新对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51247172/

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