Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将动态分配的内存释放到结构中的数组?_C++_Arrays_Struct_Malloc_Free - Fatal编程技术网

C++ 如何将动态分配的内存释放到结构中的数组?

C++ 如何将动态分配的内存释放到结构中的数组?,c++,arrays,struct,malloc,free,C++,Arrays,Struct,Malloc,Free,我试图释放struct\u Stack中已分配数组的内存,但程序一直崩溃 typedef struct _Stack { int top; unsigned int capacity; int* arr; }_Stack; _Stack* createStack(int capacity) { _Stack* stack = (_Stack*) malloc(sizeof(_Stack)); stack->capacity = capacity;

我试图释放
struct\u Stack
中已分配数组的内存,但程序一直崩溃

typedef struct _Stack
{
    int top;
    unsigned int capacity;
    int* arr;
}_Stack;

_Stack* createStack(int capacity)
{
    _Stack* stack = (_Stack*) malloc(sizeof(_Stack));
    stack->capacity = capacity;
    stack->top = -1;
    stack->arr = (int*) malloc(sizeof(stack->capacity * sizeof(int)));
    return stack;
}
我用这个函数来释放内存,但是程序在这里崩溃了

// I have a problem here.
void stack_free(_Stack* stack)
{
    free(stack->arr);
    free(stack);
}
sizeof(stack->capacity*sizeof(int))
在调用malloc时出错。它给出的不是数组的大小,而是用于表示数组大小的数字的大小。您可能需要
堆栈->容量*sizeof(int)

另一个可能的问题是,在C中不应该强制转换malloc的返回值,因为它可能隐藏其他错误并导致崩溃。看见 在C++中,你必须这么做,因为C++中的类型检查更严格,但是它仍然隐藏问题。 这些就是我看到的您所展示的代码的问题。但是,请记住malloc和free中的错误不一定是由检测到它们的实际行引起的。如果程序的某个部分损坏了malloc系统的内部数据结构,例如缓冲区溢出,则问题可能会在以后调用malloc或free时在程序的完全不同部分表现出来。

更改此项:

stack->arr = (int*) malloc(sizeof(stack->capacity * sizeof(int)));
为此:

stack->arr = (int*) malloc(stack->capacity * sizeof(int));
因为您希望数组的大小等于
stack->capacity*sizeof(int)
,而不是该表达式的大小

您的程序必须在问题中未显示的代码中的某个地方调用了未定义的行为(因为malloc'ed的大小错误),这就是它后来崩溃的原因



PS:由于使用C++,所以考虑使用<代码>新< /C> >(和<代码>删除<代码>,而不是<代码>()/代码> .< /P>如果你在C++中编程,那么为什么使用<代码> Malc C < /C>和<代码>免费< /代码>?如果您必须使用指针作为要求,首先使用智能指针,例如,并且您应该明确使用

new[]
delete[]
而不是
malloc
free
。但是,如果指针不是必需的,那么您应该改为使用。向我们展示导致这种情况并可以运行的完整代码(MCVE)。另外,不要在名称(保留)中使用下划线大写。我还建议您花一些时间阅读以下划线开头,后跟大写字母的符号(例如,
\u Stack
)是保留的。对于您的问题,您是否肯定对
Stack\u free
的每次调用都是使用
createStack
创建的指针,请尝试创建并向我们展示。也请。最后,请阅读Eric Lippert的文章,并学习如何使用调试器(包括内存调试器,例如或类似的调试器)。