在函数结束后使用指向变量的指针是否安全?
Is it safe to use a pointer to a variable after the end of the function?
如果我有一个全局指针,我像这样初始化它:
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 变量,这将导致内存韭菜,这意味着你的程序反复分配更多内存而从未解除分配它,这意味着最终你会耗尽内存。
相关文章:
- 将地址分配给本地指针后,公共对象的变量将消失
- 如果非动态变量被指针引用,何时超出范围?
- 在函数结束后使用指向变量的指针是否安全?
- 有没有将变量名称转换为双指针的简短方法?
- 成员变量指针的函数参数包
- C++ - 使用变量指针调用函数
- 如何返回值为NULL的变量指针
- 在编译时以增量方式构建变量指针的向量
- C 取消实例变量指针
- 每个方法调用上都覆盖了本地变量指针
- 决定对基类的变量指针进行函数调用
- 使用 valgrind 时获得 int 变量指针的无效读取大小错误
- 变量指针的成员函数未绘制到SDL_Surface?
- 何时使用成员变量指针
- 从成员变量指针返回布尔值
- 指向C#和C++之间接口的变量指针
- c++中指向self的成员变量指针
- 为什么变量指针包含相同数据类型的地址?
- 指向用户定义类型的类的全局变量指针
- C++分配一个变量指针地址