当我运行此代码时:
#include <stdio.h>
typedef struct _Food
{
char name [128];
} Food;
int
main (int argc, char **argv)
{
Food *food;
food = (Food*) malloc (sizeof (Food));
snprintf (food->name, 128, "%s", "Corn");
free (food);
printf ("%d\n", sizeof *food);
printf ("%s\n", food->name);
}
Run Code Online (Sandbox Code Playgroud)
我还是得到的
128
Corn
Run Code Online (Sandbox Code Playgroud)
虽然我已经解放了食物.为什么是这样?记忆真的被释放了吗?
可能重复:
为什么不删除将指针设置为NULL?
指向解除分配内存的指针有什么用途吗?
我无法帮助阅读关于析构函数的大量论坛帖子并完全混淆.
有人说调用析构函数(带delete)一次为每个调用到new.有人说析构函数会在各种情况下自动调用,即 当指针被重新分配时,当对象超出范围时.有人建议指针超出范围,同时作为返回值,其中对象作为其前自身的副本存在,(这是否需要显式销毁,因为它最初是用new?创建的?
似乎有一些建议是不止一次地调用相同的析构函数会破坏内存,因此所有delete调用都应该与之合作*pointer = NULL;以避免损坏.如果没有,那么一些更高级的对象管理系统将需要实施,或铁腕严格的所有权.
我似乎无法对调用析构函数序列进行任何讨论,即调用1)是否源自基类超类并级联到特定类,在路上调用所有虚拟化析构函数,2)源于实例化class并向上移动到超类,或3)发起类在超出范围时所具有的特定强制转换,然后遍历实例化和基类.做级联析构
最终,我根本不知道如何或何时删除对象,无论对象是否负责删除它们引用的所有对象,如何干净地处理适当的面向对象的删除例程,其中多次引用对象,它只是一个我脑子里一团糟.正如你所看到的那样,我无法真正提出一个可靠的问题,我真的希望有人可以提供一个简洁而简洁的讨论,如果不是单一的"正确"方法,至少是行业最佳实践来反对删除.
我想知道在C++中被"delete"运算符破坏的内存会发生什么.以这种方式'破坏'内存是否意味着将给定的内存设置为0或其他内容?
int* ptr = new int();
delete ptr;
ptr = 0; // or null
Run Code Online (Sandbox Code Playgroud)
我的书告诉我,在删除指向的指针后,最好将指针设置为null或0.我不明白为什么.有人会给我一个可能导致问题的情景吗?
我知道当我们需要在动态内存中给出一个指针数组的指针时我们会使用它,但我不明白它是如何在堆栈中工作的.
这是否也会在堆栈中生成一个指针数组,指向堆中的指针数组,或者它是否在堆栈中创建指向堆中指针数组的指针?如果是,那么之间有什么区别
int **p = new int*[100]
Run Code Online (Sandbox Code Playgroud)
和
int *p = new int[100]
Run Code Online (Sandbox Code Playgroud)
提前致谢.我一直试图理解这一点已经很久了,并且已经在网上阅读了很多文档,但我仍然不明白这一点.
可能重复:
删除指针后禁用指针是否合适?
我的教授告诉我们,在我们删除它指向的已分配空间后,将指针设置为0是一个好习惯,而且我一直试图养成这样做的习惯.但是当我这样做时,我的编译器会发出警告:
警告W8004 LinkedList.h 102:为'nPtr'分配一个从未在函数LinkedList :: remove(int)中使用的值
我知道警告不是世界末日,我的程序仍然可以编译,但我的OCD不会放过它.所以我问你更多知识渊博的程序员:
删除它的节点后将指针设置为0是否常见,这是一个很好的做法吗?如果我继续让我的程序编译时出现这样的警告,这有关系吗?感谢所有答案!
这是代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int *p = new int[2];
p[0] = 1;
p[1] = 2;
cout << *p++ << endl;
delete p;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它可以编译,但得到一个运行时错误"free():无效指针",后跟一个内存映射.
操作系统ubuntu 10.10
编译器:g ++ 4.4.3
我只是想知道将指针初始化为NULL或者在指针删除后将其设置为NULL是否有任何好处.
我在几个论坛上看到删除后设置为NULL是不必要的,有些编译器甚至不考虑该行.如果它什么都没改变,为什么有些人会使用它呢?
我很困惑为什么有些人在删除它之后将指针(在前面的堆上创建)指向0 .
例如:
Node* newNode = new Node();
delete newNode;
newNode = 0; // why?
Run Code Online (Sandbox Code Playgroud)
如果删除的指针指向0或其他内容,为什么重要?
对于指向int的指针,我可以这样做 -
int *p = new int;
*p = 10;
delete p; // Step 1: Memory Freed
p = 0; // Step 2: Pointer set to NULL
Run Code Online (Sandbox Code Playgroud)
现在,如果我有一个指向int数组的指针 -
int *p = new int[10];
p[1] = 1;
p[5] = 5;
delete[] p; // Step 1: Memory freed corresponding to whole array
Run Code Online (Sandbox Code Playgroud)
现在,如何在这种情况下实现"第2步"?
c++ ×10
pointers ×6
null ×3
arrays ×2
memory ×2
c ×1
destructor ×1
free ×1
memory-leaks ×1
struct ×1