gpt4 book ai didi

c - 在 C 中的自制字符串结构中使用 realloc - 可能存在内存泄漏?

转载 作者:行者123 更新时间:2023-11-30 19:37:57 27 4
gpt4 key购买 nike

作为练习,我使用函数指针在 C 中实现一个字符串“类”。

这是我定义结构的开始。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct SString* String;

struct SString
{
char* (*get)(const void* self);
void (*set)(const void* self, char* value);
int (*length)(const void* self);
void (*destroy)(void* self);
char* str;
int isInit;
};

这是我感兴趣的“方法”:

void setString(const void* self, char* value)
{
/* Allocate an extra char for the null terminator, otherwise heap corruption happens */
/* If string is not init, realloc works with NULL and acts like malloc */
/* Once it is init, it will work on the pointer like realloc */
((String)self)->str = (char*)realloc( ((!((String)self)->isInit) ? NULL : ((String)self)->str) , (sizeof(char) * strlen(value))+1 );
strcpy(((String)self)->str,value);
}

void destroyString(void* self)
{
free(((String)self)->str);
free(self);
}

String newString(char* value)
{
String self = (String)malloc(sizeof(struct SString));
self->get = &getString;
self->set = &setString;
self->length = &lengthString;
self->destroy = &destroyString;
self->isInit = 0; /* Malloc str for the first time */

self->set(self,value);
self->isInit = 1; /* Subsequent set() will realloc from now on */
return self;
}

我的主要目的只是测试这些东西:

int main(void)
{
String s = newString("Original init string");
printf("%s\nIt is %d chars long.\n\n",s->get(s),s->length(s));
s->set(s,"This is a test of a pseudo string class");
printf("%s\nIt is %d chars long.\n\n",s->get(s),s->length(s));


s->destroy(s);
s = newString("Hello");
printf("%s\nIt is %d chars long.\n\n",s->get(s),s->length(s));
s->set(s,"Resetting the string once again and then deleting");
puts(s->get(s));
s->destroy(s);

return 0;
}

从表面上看,一切正常,并且我得到了预期的输出。但是,我觉得我正在使用 setString() 函数进行一些黑客操作,该函数会切换 realloc() 的行为方式。当我调用 destroyString() 函数并释放结构中的 self“实例”和 str 时,我非常确定下次调用 newString() 时,它将重置所有内容,因此 realloc 正在处理新指针,旧的已被释放。所以理论上不应该有任何内存泄漏。

我只使用一个 set 函数来进行初始化和后续设置,因为我觉得这是一个比使用多个函数进行初始化和后续设置更优雅的解决方案,但这种权衡让我最终遇到了一些 realloc() hackery,我我不太确定它是否完全正确。

最佳答案

代码是正确的,但不是最好的代码。 realloc 没有任何明显的错误。

但是,不需要

isInitrealloc 应该在所有地方定义为 NULL。在某些系统上,malloc(n) 只是 realloc(NULL, n)

关于c - 在 C 中的自制字符串结构中使用 realloc - 可能存在内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38947135/

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