gpt4 book ai didi

c++ - 如何在指针初始化为数组的第一个索引后释放指针?

转载 作者:行者123 更新时间:2023-11-30 03:32:04 25 4
gpt4 key购买 nike

尝试学习如何使用 malloc/calloc/free 并搞乱初始化。第一个版本的代码有效,第二个版本给我一个堆损坏。但是,它们都正确地打印了数组。当我在初始化指向数组中第一个元素的地址的指针后尝试“释放(pData)”时,第二个版本中出现了这个问题。

谁能解释这种行为?有没有办法清除这样一个初始化的指针?

工作版本:

#include <iostream>
using namespace std;

int main(){
double * pData;
pData = (double*) calloc (4,sizeof(double));
if (pData==NULL) exit (1);
double uc[] = {10.0, 20.0, 30.0, 40.0};

pData[0] = uc[0];
pData[1] = uc[1];
pData[2] = uc[2];
pData[3] = uc[3];

printf ("You have entered: ");
for (int n=0;n<4;n++) cout << pData[n];
free (pData);
cin.get();
return 0;
}

堆错误的损坏:

#include <iostream>
using namespace std;

int main(){
double * pData;
pData = (double*) calloc (4,sizeof(double));
if (pData==NULL) exit (1);
double uc[] = {10.0, 20.0, 30.0, 40.0};

pData = &uc[0];

printf ("You have entered: ");
for (int n=0;n<4;n++) cout << pData[n];
free (pData);
cin.get();
return 0;
}

最佳答案

  pData = (double*) calloc (4,sizeof(double));
if (pData==NULL) exit (1);
double uc[] = {10.0, 20.0, 30.0, 40.0};

pData = &uc[0];

printf ("You have entered: ");
for (int n=0;n<4;n++) cout << pData[n];
free (pData);
cin.get();

首先,您将 pData 分配给 calloc 提供给您的指针,这是唯一允许您调用 free

然后你重新赋值pData指向一个自动生命周期变量的地址,在这个过程中丢失了calloc给你的地址,然后尝试释放。它不是这样工作的,你必须保留一份 calloc 给你的地址的拷贝,以便能够 free 它:

  pData = (double*) calloc (4,sizeof(double));
if (pData==NULL) exit (1);
double uc[] = {10.0, 20.0, 30.0, 40.0};
double* originalData = pData;
pData = &uc[0];

printf ("You have entered: ");
for (int n=0;n<4;n++) cout << pData[n];
free (originalData);
cin.get();

旁注:在 C++ 中使用 new/delete 而不是 malloc/calloc/free

旁注:如果确实需要,根本不要使用动态分配或使用智能指针。

关于c++ - 如何在指针初始化为数组的第一个索引后释放指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43764707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com