正在释放的Malloc指针未分配

时间:2016-09-21 05:36:37

标签: c++

我用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 ++,我知道我的代码不是最好的,但是非常感谢任何帮助。谢谢。

2 个答案:

答案 0 :(得分:2)

这是一个主要问题:

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 ++中,几乎不需要多态之外的指针。

答案 1 :(得分:0)

你的代码

char *tempCharArray = returnArray;
free(returnArray);
return tempCharArray;
无论如何,

想要获取tempCharArray并将其转换为

中的std :: string
std::string tempString(hyphenated);

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

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

然后您不需要任何不必要的内存分配和删除