我用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 ++,我知道我的代码不是最好的,但是非常感谢任何帮助。谢谢。
答案 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 :: stringstd::string tempString(hyphenated);
您可以在函数中直接使用std :: string而不是char数组,并将其更改为
std:: string insertHyphenNorm(const char* word, int positionToInsertAt) {
然后您不需要任何不必要的内存分配和删除