在函数结束后使用指向变量的指针是否安全?

Is it safe to use a pointer to a variable after the end of the function?

本文关键字:变量 指针 是否 安全 结束 函数      更新时间:2023-10-16

如果我有一个全局指针,我像这样初始化它:

Image *fbPtr = NULL;
...
void initFrameBuffer(const BootInfo::FrameBuffer &info) {
Image fb(info.getWidth(), info.getHeight(), info.getBpp(), info.getBuf());
fbPtr = &fb;
}

会不会是未定义的行为?fb 变量是否会在函数末尾被删除并且指针无效? 我正在使用GCC10并使用-std=c ++ 2a进行编译,如果它有任何区别的话。

是的,这是未定义的行为,特别是使用指向堆栈上变量的指针(在没有 new 关键字的情况下定义的变量(称为悬空指针。在这种情况下,您可以简单地将函数体替换为以下内容:

void initFrameBuffer(const BootInfo::FrameBuffer &info( { Image * fb = new Image(info.getWidth((, info.getHeight((, info.getBpp((, info.getBuf(((; fbPtr = fb; }

这将图像定义为指针,并在堆而不是堆栈上分配数据。这也意味着您最终需要使用delete fbPtr;删除它,否则图像对象将永远占用内存。如果你在不删除内容的情况下更改 fbPtr 变量,这将导致内存韭菜,这意味着你的程序反复分配更多内存而从未解除分配它,这意味着最终你会耗尽内存。