gpt4 book ai didi

c++ - 为什么我在打印值时得到垃圾值?

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

我正在尝试了解 PIMPL 惯用语和一般的 C++。

我有一个带有 PIMPL 风格接口(interface)的类,它将一个 int 值设置为 7。但是,当我打印它时,我得到了一个垃圾值,我不明白为什么。

代码

测试.cpp

#include <iostream>
#include "Test.h"
struct Foo::Bar
{
int value;
};

Foo::Foo()
{
Bar tempBar;
myBar = &tempBar;
myBar->value = 7;
}
void Foo::printValue()
{
std::cout << "Value = " << myBar->value << std::endl;
}
int main()
{
Foo myFoo;
myFoo.printValue();
return 0;
}

测试.h

class Foo
{
private:
struct Bar;
Bar* myBar;
public:
Foo();
void printValue();
//~Foo();
};

输出

值 = 2147120498

最佳答案

mybar 是指向 Foo 构造函数中局部变量的指针。当构造函数退出时,变量消失了,但是 myBar 仍然指向旧内存。

既然要实现PIMPL,那真的只有一种选择。您需要使用 new 动态分配 myBar,并在 Foo 析构函数中使用 delete 释放它。您还必须向 Foo 添加一个复制构造函数和一个复制赋值运算符,以避免内存泄漏:

测试.cpp

Foo::Foo()
{
myBar = new Bar;
myBar->value = 7;
}

Foo::Foo(const Foo &src)
{
myBar = new Bar;
*myBar = *(src.myBar);
}

Foo::~Foo()
{
delete myBar;
}

Foo& Foo::operator=(const Foo &rhs)
{
*myBar = *(rhs.myBar);
return *this;
}

测试.h

class Foo
{
private:
struct Bar;
Bar* myBar;
public:
Foo();
Foo(const Foo &src);
~Foo();

void printValue();

Foo& operator=(const Foo &rhs);
};

如果您不实现 PIMPL,那么还有另一种选择。使 myBar 成为 Foo 类的非指针成员:

测试.cpp

Foo::Foo()
{
myBar.value = 7;
}

void Foo::printValue()
{
std::cout << "Value = " << myBar.value << std::endl;
}

测试.h

class Foo
{
private:
struct Bar
{
int value;
};

Bar myBar;

public:
Foo();
void printValue();
};

关于c++ - 为什么我在打印值时得到垃圾值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36586488/

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