如何正确使用免费的数据

时间:2011-08-22 11:13:53

标签: c

struct str {
uint8_t *data;
};

int main() {
    struct str *buffer;
    free(buffer->data);
}

如何在免费使用前正确检查数据?此示例调用分段失败...

7 个答案:

答案 0 :(得分:2)

在您的示例中,您释放了一个单位指针,这通常会导致seg错误。在释放指针之前无法测试指针,因此您必须确保只释放有效指针(即从malloc等返回的指针)。

编辑:正如有几位人士指出的那样,由于buffer未初始化,仅仅访问buffer->data的行为也会导致段错误。

答案 1 :(得分:2)

这是因为您的数据尚未分配。您只在struct str上创建一个指针。正确使用如下:

int main() {
  struct str *buffer = (struct str*)malloc(sizeof(struct str));
  if (buffer == NULL) { fprintf(stderr, "Error with malloc\n"); exit (EXIT_FAILURE); }
  buffer->data = (uint8_t*)malloc(sizeof uint8_t);
  if (buffer->data == NULL) { fprintf(stderr, "Error with malloc\n"); exit (EXIT_FAILURE); }
  // Process data here
  free(buffer->data);
  free(buffer);
  return 0;
}

答案 2 :(得分:1)

你可以释放()只从malloc()或realloc()返回的指针。给定一个任意指针,无法检查是否可以释放它。

答案 3 :(得分:1)

在调用free之前,您需要为此分配内存。如果它未初始化,buffer->data可以指向任何位置,并且在未初始化指针上使用free是未定义的行为。

答案 4 :(得分:1)

除了已经说过的内容之外,如果您知道指针应该用于动态内存分配,请始终将其初始化为NULL。

如果将NULL指针传递给free()和C ++ delete,则保证不会执行任何操作。

这就是为什么在释放指针后总是将指针设置为NULL的原因。

#include <stddef.h>    

int* ptr = NULL;
...
// malloc ptr or don't do a thing

free(ptr);  // won't crash no matter if ptr is allocated or not
ptr = NULL; // ptr is free to be used again

答案 5 :(得分:0)

您没有分配任何内存,也没有在代码中初始化指针。

适当的用法是这样的:

struct str {
uint8_t *data;
};

int main() {
    struct str *buffer;
    buffer = malloca(sizeof(struct str));
    if (buffer == NULL) {
        return 1; // failed to allocate buffer
    }
    buffer->data = malloc(sizeof(uin8_t));
    if (buffer->data == NULL) {
        free(buffer); // failed to allocate data
        return 1;
    }
    free(buffer->data);
    free(buffer);
    return 0;
}

答案 6 :(得分:0)

free()不是您(唯一)的问题。 buffer是一个未初始化的指针,因此取消引用它(buffer->data)的行为几乎肯定会导致段错误。如果此代码为:

,您还会收到段错误
struct str {
uint8_t *data;
};

int main() {
    struct str *buffer;
    printf("%p\n", buffer->data);
}