在Visual Studio中,我们都有"baadf00d",在运行时在C++中检查调试器中的变量时看到过"CC"和"CD".
根据我的理解,"CC"仅处于DEBUG模式,以指示内存何时是new()或alloc()并且是单元化的."CD"代表删除或免费内存.我在RELEASE版本中只看过"baadf00d"(但我可能错了).
偶尔会遇到内存泄漏,缓冲区溢出等问题,这些信息会派上用场.
是否有人能够指出何时以何种模式将内存设置为可识别的字节模式以进行调试?
我已经使用 malloc 模拟了一个堆栈,以创建一个 MAX 元素数组并将其分配给一个指针。然后我创建了一个指向第一个指针的第二个指针,以便能够来回导航,执行推送和弹出。
int * stack= (int *) malloc(MAX * sizeof(*stack));
int * stack_ptr = stack;
Run Code Online (Sandbox Code Playgroud)
最后,我删除包含数组的指针,使用
free (stack);
Run Code Online (Sandbox Code Playgroud)
删除数组(stack)后,stack_ptr指向一个没有内容的地址,对吗?
即使程序恰好在此之后终止,这是否会导致内存泄漏或任何类型的问题?
据我了解,C++ 编译器会自动尝试删除超出范围的对象。然而,在这个记录悬空指针情况的SO 帖子中,有一个char数组被自动清除但没有delete操作:
char *func()
{
char str[10];
strcpy(str, "Hello!");
return str;
}
Run Code Online (Sandbox Code Playgroud)
这显然会返回一个悬空指针,因为内存将在作用域之后被释放。但是,如果我没有指定,这怎么可能delete?就我而言,这个网站显示了我认为在类似情况下会发生的情况:
#include <iostream>
using namespace std;
void oil_leak() {
//allocate 8 bytes from heap
double *pointer = new double(32.54);
}
int main() {
oil_leak();
}
Run Code Online (Sandbox Code Playgroud)
即,为指针分配的内存在作用域之后没有释放,导致内存泄漏。