重用缓冲区指针_before_ free
reusing buffer pointers _before_ free
我对 C 还是有点陌生,尤其是动态内存分配:在它的定义和可能的 free
之间重用缓冲区指针是否安全 without重新初始化它?
我说可能是免费的,因为指针可能指向静态分配的缓冲区:
char buf[1024];
char *bufp = buf;
因此,如果我有一个名为 tmp
的缓冲区指针,我是否需要重新初始化它以保证任何先前的赋值都将被覆盖?
这些安全吗:
指针的内存被函数填充
char *tmp = malloc(sizeof(char)*1024);
FILE *fp = fopen("/foo");
// initial assignment
fgets(tmp, sizeof tmp, fp);
fclose(fp);
fp = fopen("/bar");
// does this replace the previous assignment?
fgets(tmp, sizeof tmp, fp);
fclose(fp);
free(tmp);
指针的内存已内联填充
char *tmp = malloc(sizeof(char)*1024);
tmp = "foo";
/* `tmp' gets used, but not free'd or assigned */
tmp = "bar";
/* ... */
free(tmp);
或者我应该将 tmp
分配给 '[=16=]'
(即 tmp = '[=17=]';
)或者在每个分配
之间做类似 memset(tmp, '[=18=]', sizeof tmp)
的事情
您的第一个代码示例没有问题(sizeof
问题除外)。您分配一些内存,然后将内容写入其中,然后用其他内容覆盖它。
在第二个代码示例中,它没有按照您的想法进行操作。该行:
tmp = "foo";
使 tmp
指向已存储 "foo"
的内存部分。它不会将 foo
复制到 tmp
当前指向的位置。这会导致内存泄漏,因为现在没有指向您 malloc
的区域的指针。
代码应该是:
char *tmp = malloc(1024); // sizeof(char) always 1
strcpy(tmp, "foo");
strcpy(tmp, "bar");
free(tmp);
我对 C 还是有点陌生,尤其是动态内存分配:在它的定义和可能的 free
之间重用缓冲区指针是否安全 without重新初始化它?
我说可能是免费的,因为指针可能指向静态分配的缓冲区:
char buf[1024];
char *bufp = buf;
因此,如果我有一个名为 tmp
的缓冲区指针,我是否需要重新初始化它以保证任何先前的赋值都将被覆盖?
这些安全吗:
指针的内存被函数填充
char *tmp = malloc(sizeof(char)*1024); FILE *fp = fopen("/foo"); // initial assignment fgets(tmp, sizeof tmp, fp); fclose(fp); fp = fopen("/bar"); // does this replace the previous assignment? fgets(tmp, sizeof tmp, fp); fclose(fp); free(tmp);
指针的内存已内联填充
char *tmp = malloc(sizeof(char)*1024); tmp = "foo"; /* `tmp' gets used, but not free'd or assigned */ tmp = "bar"; /* ... */ free(tmp);
或者我应该将 tmp
分配给 '[=16=]'
(即 tmp = '[=17=]';
)或者在每个分配
memset(tmp, '[=18=]', sizeof tmp)
的事情
您的第一个代码示例没有问题(sizeof
问题除外)。您分配一些内存,然后将内容写入其中,然后用其他内容覆盖它。
在第二个代码示例中,它没有按照您的想法进行操作。该行:
tmp = "foo";
使 tmp
指向已存储 "foo"
的内存部分。它不会将 foo
复制到 tmp
当前指向的位置。这会导致内存泄漏,因为现在没有指向您 malloc
的区域的指针。
代码应该是:
char *tmp = malloc(1024); // sizeof(char) always 1
strcpy(tmp, "foo");
strcpy(tmp, "bar");
free(tmp);