gpt4 book ai didi

c++ - 在 C++ 中将指针值赋给变量的副作用

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

我在将指针的引用分配给变量时遇到了一些奇怪的问题:本地代码工作正常,但它会导致其他地方出现内存访问错误:

//This works fine
Gridcell* g = model.gc;
cout << g->LC_updated << " " << g << endl;

//When I include this, the program crashes elsewhere
//But output from this line is OK
Gridcell gc = *g;
cout << "Var:" << gc.LC_updated << &gc << endl;

(Gridcell 是一个类,它没有无参构造函数)我不是 C++ 专家,这是一个相当大的外部库,但我不明白为什么对局部范围变量的赋值会在其他地方引起问题。任何人都可以阐明这一点吗?

最佳答案

您没有提供足够的信息来解决问题。您发布的代码本身没有任何问题。

我的猜测是 Gridcell 缺少适当的复制构造函数,因此当 gc 超出范围时,它会删除 *g 仍然存在的内容引用。

这行代码:

Gridcell gc = *g;

是调用复制构造函数的地方。它本质上等同于这样说:

Gridcell gc(*g);

调用 Gridcell::Gridcell(const Gridcell &) 构造函数,也称为复制构造函数。拷贝构造函数的特殊之处在于,如果你没有,编译器会自动为你生成一个。自动生成的通常只调用每个成员变量的复制构造函数,包括指针。对于基本类型,如 intFoo *,复制构造函数只是进行精确复制。

例如,如果您有这样的代码:

class Foo {
public:

Foo() : msg_(new char[30]) { strcpy(msg_, "I'm Foo!"); }
~Foo() { delete [] msg_; }

private:
char *msg_;
};

void aFunction(Foo *aFoo)
{
Foo myfoo = *aFoo;
}

void anotherFunction()
{
Foo localfoo;
aFunction(&localfoo);
}

它会崩溃。 localfoo 将分配字符数组。 Foo myfoo = *aFoo 行将调用复制构造函数,该构造函数将直接复制指针。然后将调用 myfoo 的析构函数并释放内存。然后将调用 localfoo 的析构函数并再次释放内存,导致许多系统崩溃。

关于c++ - 在 C++ 中将指针值赋给变量的副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5324404/

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