gpt4 book ai didi

c - 检测到 glibc - 双重释放或损坏 (!prev)

转载 作者:太空宇宙 更新时间:2023-11-04 02:01:45 24 4
gpt4 key购买 nike

我遇到了您可能在标题中看到的错误,但我不知道为什么。

代码:

#include <cstdlib>
#include <cstdio>

struct CData {
int* num;
char* adr;
char* ph;

void (*init)(CData* owner);
void (*del)(CData* owner);
char* (*getAdr)(CData* owner);
void (*setAdr)(CData* owner, char* adr);
};

void CData_init(CData* owner) {
owner->num = (int*)malloc(sizeof(int));
owner->adr = (char*)malloc(sizeof(char)*255);
owner->ph = (char*)malloc(sizeof(char)*255);
}

void CData_del(CData* owner) {
free(owner->num);
free(owner->adr);
free(owner->ph);
}

char* CData_getAdr(CData* owner) {
return owner->adr;
}

void CData_setAdr(CData* owner, char* adr) {
owner->adr = adr;
}

int main() {
CData* data = (CData*)malloc(sizeof(CData));

data->init = CData_init;
data->del = CData_del;
data->getAdr = CData_getAdr;
data->setAdr = CData_setAdr;

data->init(data);

data->setAdr(data, "asdasd");
printf("%d", data->getAdr(data));

data->del(data);

free(data);

return 0;
}

所以我认为错误是由 char* 操作引起的,但我不知道为什么。

我想做的是,我希望可以将一个字符串作为参数传递给 data->setAdr,然后我希望将它分配给变量。

编译行:

gcc -o test main.cpp

最佳答案

data->setAdr(data, "asdasd"); 有问题。

您正在设置不是由 malloc 分配的内存块的地址,然后尝试使用 free 释放它。释放 NULL 指针以外的此类内存块(不是由 malloc 分配的)会导致未定义的行为。

在您的情况下,这也会泄漏至少 255 字节的内存。 valgrind在这种情况下可以帮助您更好地理解。

更改以下函数应该可以解决此问题(适当重命名)

void CData_setAdr(CData* owner, char* adr) {
strcpy(owner->adr, adr); /* include cstring */
}

关于c - 检测到 glibc - 双重释放或损坏 (!prev),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26501174/

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