c++ - 在释放内存之前总是重新分配内存是否安全 - C++
问题描述
假设代码如下:
#include <stdlib.h>
int main(int argc, char* argv[]) {
int value = 42;
void* pointer = (void*) &value;
// Free stack memory
free(pointer);
return 0;
}
此代码会导致未定义的行为,因为它尝试取消分配堆栈上的内存。
但我想知道;每次释放指针之前重新分配指针怎么样。
#include <stdlib.h>
int main(int argc, char* argv[]) {
int value = 42;
void* pointer = (void*) &value;
// Allocate pointer on heap, then free memory
pointer = realloc(pointer, sizeof pointer);
free(pointer);
return 0;
}
我的假设是这会将指针发送到堆内存,以便可以适当地释放它。
所有这一切都与程序员不知道指针指定在哪个内存(堆或堆栈)上的上下文有关(此时,程序的设计受到质疑,但我不会离题)。
询问
这是确保正确释放内存的安全方法,还是不正确并创建留在内存中的垃圾对象?
解决方案
你不能realloc
堆叠内存——所以你仍然有未定义的行为。
realloc(3) 手册页会告诉你:
重新分配给定的内存区域。它必须事先由 malloc()、calloc() 或 realloc() 分配,并且尚未通过调用 free 或 realloc 释放。否则,结果是不确定的。
推荐阅读
- python - 在 Django python 表单中,我如何给表单字段一个“第二个名字”?
- node.js - 获取 node.js 中特定密码的 IV 大小
- python - 如何在不使用 gmpy 的情况下获得 64 位整数?
- powerbi - 如何使用快速测量 MoM% 并在视觉上应用过滤器以排除当前月份
- python - pyopengl 中圆形物体的速度问题
- amazon-web-services - 如何监控 EC2 EMR 集群状态
- google-cloud-nl - 使用 Google AutoML 对印度尼西亚语文章进行分类
- python - 将多维张量中的一个值映射到另一个值
- java - flink 在检查点上给了我“也可以打开文件”
- symfony - 我们可以使用来自另一个 Symfony 项目的存储库吗?