相关疑难解决方法(0)

免费后将变量设置为NULL

在我的公司中,有一个编码规则,在释放任何内存后,将变量重置为NULL.例如 ...

void some_func () 
{
    int *nPtr;

    nPtr = malloc (100);

    free (nPtr);
    nPtr = NULL;

    return;
}
Run Code Online (Sandbox Code Playgroud)

我觉得,在上面显示的代码中,设置为NULL没有任何意义.或者我错过了什么?

如果在这种情况下没有任何意义,我将采用"质量团队"来删除此编码规则.请指教.

c malloc free coding-style heap-memory

146
推荐指数
11
解决办法
8万
查看次数

删除指针后将指针NULL化是一种好习惯吗?

我首先要说的是,使用智能指针,你永远不必担心这一点.

以下代码有什么问题?

Foo * p = new Foo;
// (use p)
delete p;
p = NULL;
Run Code Online (Sandbox Code Playgroud)

这是由另一个问题的回答和评论引发的.Neil Butterworth的一条评论产生了一些赞成:

在删除后将指针设置为NULL不是C++中的通用优良做法.有时候它是一件好事,有时它是毫无意义的,可以隐藏错误.

有很多情况下它无济于事.但根据我的经验,它不会伤害.有人开导我.

c++ null pointers dynamic-allocation

139
推荐指数
6
解决办法
8万
查看次数

ptr为NULL的free(ptr)是否会损坏内存?

从理论上讲,我可以这么说

free(ptr);
free(ptr); 
Run Code Online (Sandbox Code Playgroud)

是一个内存损坏,因为我们释放已经释放的内存.

但是如果

free(ptr);
ptr=NULL;
free(ptr); 
Run Code Online (Sandbox Code Playgroud)

由于操作系统将以不确定的方式运行,我无法对此进行实际的理论分析.无论我在做什么,这种记忆是否会腐败?

释放空指针有效吗?

c free null pointers

106
推荐指数
7
解决办法
7万
查看次数

如何在托管代码环境之外安全编程?

如果您是使用C或C++编程的人,没有内存管理的托管语言优势,类型检查或缓冲区溢出保护,使用指针算法,您如何确保您的程序是安全的?您是否使用了大量的单元测试,或者您只是一个谨慎的编码器?你有其他方法吗?

c c++ pointers memory-leaks buffer-overrun

8
推荐指数
3
解决办法
1564
查看次数

我们为什么要在free()释放内存后使指针无效?

可能重复:在释放它们之后
真的应该设置指针NULL吗?

我使用malloc和calloc为指针分配了动态内存.使用此指针后,我应该释放内存,以便可以将块返回到OS(很好).现在我的问题是,在释放块之后,我为什么要这样做:

pointer = NULL;
Run Code Online (Sandbox Code Playgroud)

感谢帮助...

c null pointers

3
推荐指数
1
解决办法
4187
查看次数

C++会把这个函数泄漏吗?

我已经开始写一个简单的控制台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)

c++ memory-leaks

2
推荐指数
1
解决办法
368
查看次数

为什么在“free”之后取消引用 C 指针的值为 0

下面是代码:

#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'??

为什么会这样?

c pointers

2
推荐指数
1
解决办法
1139
查看次数

我应该在删除后指定我的指针0吗?

可能重复:
删除指针后禁用指针是否合适?

我的教授告诉我们,在我们删除它指向的已分配空间后,将指针设置为0是一个好习惯,而且我一直试图养成这样做的习惯.但是当我这样做时,我的编译器会发出警告:

警告W8004 LinkedList.h 102:为'nPtr'分配一个从未在函数LinkedList :: remove(int)中使用的值

我知道警告不是世界末日,我的程序仍然可以编译,但我的OCD不会放过它.所以我问你更多知识渊博的程序员:

删除它的节点后将指针设置为0是否常见,这是一个很好的做法吗?如果我继续让我的程序编译时出现这样的警告,这有关系吗?感谢所有答案!

c++ pointers compiler-warnings

0
推荐指数
1
解决办法
2642
查看次数

C - 指针在释放后不为空

释放后指针的值是否为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之间的值不同?

c free pointers dynamic-memory-allocation

-2
推荐指数
1
解决办法
861
查看次数