未分配被释放的Malloc指针

Malloc pointer being freed was not allocated

本文关键字:Malloc 指针 释放 分配      更新时间:2023-10-16

我用c++写了这个程序,它还没有完全完成,但我正在测试它,我一直得到这个错误Hyphen(36636,0x7fff7d65b300) malloc: *** error for object 0x10d31858e: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug,我不太确定该怎么做,我是c++新手,我知道我的代码不是最好的,但任何帮助都非常感谢。谢谢你。

这是一个主要问题:

char *tempCharArray = returnArray;
free(returnArray);
return tempCharArray;

复制指针到tempCharArray,释放指针指向的内存,然后返回指针。当使用指针时,它不再指向已分配的内存,你将有未定义的行为

然后是这个:

char* goHyphen(const char* input) {
    ...
    string *finWords = new string[numWords];
    ...
    return (char*)finWords;
}

这真的是错了。特别是考虑到你如何使用它:

char* actual = goHyphen( input );
bool  equal  = strcmp( expected, actual ) == 0;

这是另一个主要问题,还有未定义行为

你也做

delete actual;

这是另一个导致未定义行为的问题(您应该在这里使用delete[])。

顺便说一下,这可能是最后的delete,导致你的问题(你真的需要学习如何使用调试器):你传递一个指向字符串文字的指针给goHyphen函数,goHyphen函数可能返回这个指针。然后你尝试delete这个指针,即使你没有分配它(即当它指向字符串字面量时)。


你似乎太依赖指针了,别那么做了。使用std::vector代替动态分配。你也可以将new[]/delete[](以及在某些情况下new[]delete)与malloc/free混合使用,不要这样做(如果你使用std::vector,你不必这样做)。

这里有一个很好的经验法则:如果你需要做c风格的强制转换,这表明你在做一些你不应该做的事情。

另一个经验法则:如果你需要一个字符串使用std::string 实例(即对象),如果你需要一个"动态数组"使用std::vector 对象

最后:尽可能远离指针。在现代c++中,几乎不需要多态性之外的指针。

你的代码

char *tempCharArray = returnArray;
free(returnArray);
return tempCharArray;

无论如何都要取tempCharArray并在

处将其转换为std::string
std::string tempString(hyphenated);

你可以在函数中直接使用std::string而不是char array,并将其更改为

std:: string insertHyphenNorm(const char* word, int positionToInsertAt) {

那么你就不需要任何不必要的内存分配和删除