在我的公司中,有一个编码规则,在释放任何内存后,将变量重置为NULL.例如 ...
void some_func ()
{
int *nPtr;
nPtr = malloc (100);
free (nPtr);
nPtr = NULL;
return;
}
Run Code Online (Sandbox Code Playgroud)
我觉得,在上面显示的代码中,设置为NULL没有任何意义.或者我错过了什么?
如果在这种情况下没有任何意义,我将采用"质量团队"来删除此编码规则.请指教.
我首先要说的是,使用智能指针,你永远不必担心这一点.
以下代码有什么问题?
Foo * p = new Foo;
// (use p)
delete p;
p = NULL;
Run Code Online (Sandbox Code Playgroud)
这是由另一个问题的回答和评论引发的.Neil Butterworth的一条评论产生了一些赞成:
在删除后将指针设置为NULL不是C++中的通用优良做法.有时候它是一件好事,有时它是毫无意义的,可以隐藏错误.
有很多情况下它无济于事.但根据我的经验,它不会伤害.有人开导我.
从理论上讲,我可以这么说
free(ptr);
free(ptr);
Run Code Online (Sandbox Code Playgroud)
是一个内存损坏,因为我们释放已经释放的内存.
但是如果
free(ptr);
ptr=NULL;
free(ptr);
Run Code Online (Sandbox Code Playgroud)
由于操作系统将以不确定的方式运行,我无法对此进行实际的理论分析.无论我在做什么,这种记忆是否会腐败?
释放空指针有效吗?
如果您是使用C或C++编程的人,没有内存管理的托管语言优势,类型检查或缓冲区溢出保护,使用指针算法,您如何确保您的程序是安全的?您是否使用了大量的单元测试,或者您只是一个谨慎的编码器?你有其他方法吗?
可能重复:在释放它们之后
真的应该设置指针NULL
吗?
我使用malloc和calloc为指针分配了动态内存.使用此指针后,我应该释放内存,以便可以将块返回到OS(很好).现在我的问题是,在释放块之后,我为什么要这样做:
pointer = NULL;
Run Code Online (Sandbox Code Playgroud)
感谢帮助...
我已经开始写一个简单的控制台Yahtzee游戏进行练习.我只是对这个功能是否会泄漏内存有疑问.每次需要重新滚动骰子时都会调用滚动功能.
它的作用是创建一个动态数组.第一次使用它会存储5个随机值.对于下一次运行,除了你要保留的骰子外,它只会重新滚动.我有另一个功能,但由于它与这个问题无关,我把它留了出来
主功能
int *kast = NULL; //rolled dice
int *keep_dice = NULL; //which dice to re-roll or keep
kast = roll(kast, keep_dice);
delete[] kast;
Run Code Online (Sandbox Code Playgroud)
这是功能
int *roll(int *dice, int *keep) {
srand((unsigned)time(0));
int *arr = new int[DICE];
if(!dice)
{
for(int i=0;i<DICE;i++)
{
arr[i] = (rand()%6)+1;
cout << arr[i] << " ";
}
}
else
{
for(int i=0;i<DICE;i++)
{
if(!keep[i])
{
dice[i] = (rand()%6)+1;
cout << "Change ";
}
else
{
keep[i] = 0;
cout << "Keep ";
}
} …
Run Code Online (Sandbox Code Playgroud) 下面是代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p;
p=(int *)malloc(sizeof(int));
*p=5;
printf("Before freeing=%p\n",p);
printf("Value of p=%d\n",*p);
//making it dangling pointer
free(p);
printf("After freeing =%p\n",p);
printf("Value of p=%d\n",*p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
下面是输出:
Before freeing=0x1485010
Value of p=5
After freeing =0x1485010
Value of p=0
Run Code Online (Sandbox Code Playgroud)
释放指针后,解引用给出输出“0”(零)。
下面是另一个也给出“0”的代码
include <stdio.h>
#include <stdlib.h>
int main()
{
int *p;
p=(int *)malloc(sizeof(int));
printf("Before freeing=%p\n",(void *)p);
printf("Value of p=%d\n",*p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这个我没有释放内存,只是分配了它,它仍然给出 '0' 。是不是每个未初始化指针的默认值都是'0'??
为什么会这样?
可能重复:
删除指针后禁用指针是否合适?
我的教授告诉我们,在我们删除它指向的已分配空间后,将指针设置为0是一个好习惯,而且我一直试图养成这样做的习惯.但是当我这样做时,我的编译器会发出警告:
警告W8004 LinkedList.h 102:为'nPtr'分配一个从未在函数LinkedList :: remove(int)中使用的值
我知道警告不是世界末日,我的程序仍然可以编译,但我的OCD不会放过它.所以我问你更多知识渊博的程序员:
删除它的节点后将指针设置为0是否常见,这是一个很好的做法吗?如果我继续让我的程序编译时出现这样的警告,这有关系吗?感谢所有答案!
释放后指针的值是否为NULL?
int* p = malloc(sizeof(*p));
free(p);
if(p==NULL)
printf("Null\n");
else
printf("Not null\n");
Run Code Online (Sandbox Code Playgroud)
输出:
Not null
Run Code Online (Sandbox Code Playgroud)
好吧,我假设没有;
无论如何,我今天早些时候提出了一个问题:
在这里查看: C - 如何释放动态分配的内存?
List* head1 = NULL;
insertFront(&head1, 1);
insertFront(&head1, 2);
print(head1);
while (head1)
{
List *temp = head1;
head1 = head1->next;
free(temp);
}
if(head1 == NULL)
printf("Null\n");
else
printf("Not null\n");
Run Code Online (Sandbox Code Playgroud)
这种情况下的输出:
Null
Run Code Online (Sandbox Code Playgroud)
在这种情况下,在释放head1(节点也)后,head1变为null,不是吗?
最后,我错过了一些概念吗?
head1为null,但p不是.
我的问题是:
为什么head1和p之间的值不同?
pointers ×7
c ×6
c++ ×4
free ×3
null ×3
memory-leaks ×2
coding-style ×1
heap-memory ×1
malloc ×1