在C中释放char []会产生错误,C编译器如何处理char []

时间:2018-01-10 08:53:43

标签: c pointers

虽然数组基本上是指针,但在 C 中释放char[]会产生错误。

#include <stdlib.h>

int main(void) {
    char ptr[] = "Hello World";

    free(ptr); // this gives error at run time
}

错误:nexc(4212,0x10038e3c0)malloc: *对象0x7fff5fbff54c的错误:未释放指针被释放 * 在malloc_error_break中设置断点以进行调试

有趣的是,它说我正在释放一个未分配的指针 怎么会发生这种情况?

但是在 C ++ 中,编译器会给我一个编译时错误。

int main(void) {
    char ptr[] = "Hello World";

    delete ptr; // this gives error at compile time
}

等,     的 Cannot delete expression of type char[12]

我认为这是因为编译器通过在调用函数时分配来处理char[12]并在函数结束时释放内存。所以,我在函数结束之前在free(ptr);之后写了一些代码。

#include <stdlib.h>

int main(void) {
    char ptr[] = "Hello World";

    free(ptr); // this still gives error at run time

    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");
}

这仍然会出错。这是怎么回事?

6 个答案:

答案 0 :(得分:4)

您只使用free(直接或间接)或相关功能(例如mallocrealloc分配了您的内容。

尝试传递malloc未返回的指针将导致undefined behavior

您在C ++中遇到delete的编译器错误首先是因为C和C ++是不同的语言具有不同的规则。

请记住,数组是一个数组,而不是一个指针。虽然在很多情况下(例如将函数传递给函数时),数组可以衰减指向其第一个元素的指针。

答案 1 :(得分:3)

在使用freemalloc&amp; c分配的动态内存上调用calloc。同样,您只能在分配有delete的内存上调用new。在您的情况下,C ++编译器需要发出诊断,因为在此特定实例中不允许发生指针衰减,并且delete需要指针类型。

尝试在自动内存上调用free时的行为未定义

答案 2 :(得分:1)

你只需要释放malloced的内容 你的ptr不是一个指针,它是一个数组;自动本地(main()内部)变量。它不需要释放,试图释放它是一个错误。

答案 3 :(得分:0)

所有静态字符串都将在数据部分中分配。您无法从此部分释放数据。因此,您只能释放已使用malloc分配的数据(calloc / ralloc)

答案 4 :(得分:0)

在C编程语言中,由于显而易见的原因,您无法编写您所做的指令。首先,必须要理解的是,指针变量是一个变量,就像许多其他类型的变量一样,只有它只包含地址,因此它被称为指针变量,因为它包含内存中的内容。因此,指针是与数据类型相关联的地址,而这些两个元素是不可分割的。

如果指针变量包含整个类型的对象的地址,则指向的对象用于了解如何解释构成此对象的位以及其大小。因此,您编写的指令是指向存储在内存中某个字符类型的常量指针。因此,字符串可能放在只读数据段中,因此您无法修改字符串或释放其内存,因为指针变量不会指向动态分配的空间中的字符串 &#34;的malloc&#34;或者&#34; calloc&#34;分配功能,这就是你有错误信息的原因。

第二个错误是由于你的部分混乱,你必须明白一个字符数组和一个指针之间存在差异。简单来说,指针变量不是数组,数组不是指针,但是以相同的方式访问元素。对于数组,组成字符串的字符以&#34; \ 0&#34;结尾。可以更改,但字符数组将始终指向内存中的相同地址,指针可以包含另一个地址,但要注意,如果您使用指针分配内存然后指向其他分区而不释放您分配的内存创建内存泄漏。

答案 5 :(得分:-2)

这是使用删除的正确方法!你首先必须让编译器知道变量ptr是动态的,使用new!

#include<iostream>
#include<new>
using namespace std;

int main(void) {

    char *ptr;
    try{
    ptr = new char [20];
    } catch(bad_alloc xa){
        cout<<"error";
    }

    ptr= "Hello World";
    cout<<ptr;

    delete [] ptr; 
}