2016-09-21 13 views
-2

私はこのプログラムをC++で書いていますが、まだ完成していませんが、テストしていますが、このエラーが発生していますHyphen(36636,0x7fff7d65b300) malloc: *** error for object 0x10d31858e: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debugと私はそれについて何をすべきか分かりません私のコードは最高ではないことは分かっていますが、どんな助けでも大歓迎です。ありがとうございました。ここでMallocポインタが解放されていません

+0

これはあまりにも多くのコードを掘り下げるためのものです。 [mcve]を投稿してください。 –

+0

main関数も含めることができます。 – user3286661

答えて

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[]を使用する必要があります)未定義の動作につながる別の問題である

delete actual; 

を行います。ところで

は、それはあなたの問題を引き起こし、この最後のdeleteは(あなた本当にデバッガを使用する方法を学ぶ必要がある)ことがあります:あなたはgoHyphen関数に文字列リテラルへのポインタを渡すと、それはですgoHyphen関数がこのポインタを返す可能性があります。次に、たとえ割り当てられていなくても(すなわち、文字列リテラルを指すとき)、このポインタをdeleteにしようとします。


あなたはポインタに多く頼っているようですが、それをやめてください。動的割り当ての代わりにstd::vectorを使用してください。また、/freenew[]/delete[](場合によってはnew[]delete)を混ぜてください。そうしないでください。そうしないと、std::vectorを使用してもその必要はありません。

ここでは、大雑把に言えば、Cスタイルのキャストをする必要がある場合、それはあなたがするべきではないことの兆候です。

親指のもう一つのルール:あなたは、文字列の使用が必要な場合はstd::stringインスタンス(すなわち、オブジェクト)を、そしてあなたは、「動的配列」はstd::vectorオブジェクトを使用する必要がある場合。

最後に、可能な限りポインタから離れてください。現代のC++では、多型の外にポインタはほとんど必要ありません。

+0

ありがとうございます。最初の部分では、これを削除するのを忘れてしまいました。残念ですが、私はエラーを取り除くために何かしようとしていました。メソッド 'goHyphen'の問題については、間違っていると言うときに何が問題なのか、私はC++のまったく新しいものです。これはクラスのプロジェクトとメインのコードです私たちの教授によって提供されるので、私はそれを本当に変えることはできません。 –

+0

@PatrickHennisもしあなたが「C++の真新しい」なら、あなたは複雑なIMOに何らかのやり方をしています。やめる。ちょっと戻って、[良い初心者の本を見つけて](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)、もう一度やり直してください。 –

+0

@PatrickHennisああ、あなたの教授に「実際の削除」を「実際の削除」に変更するよう教えてください。渡された引数を返すときに、文字列の重複を行う必要がある(つまり、 'new []'を使ってメモリを作成する)必要があります。 –

0

あなたのコード

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

はとにかくtempCharArrayを取るとstdに変換したいです::あなたが直接あなたの関数内のstd ::文字列の代わりに、char型の配列を使用することができます

std::string tempString(hyphenated); 

の文字列

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

次に、不要なメモリの割り当てと削除は不要です

関連する問題