2016-10-25 8 views
0

私は、次の機能を持たをallocated`いませんでした解放されています。文字列のコピーの関数の結果は


(私はこの機能を堅牢にしようとしているとして)私は、私はそれを使用する方法が重要であるべきとは思わないが、ここでいくつかの例は以下のとおりです。

CD::CD(char * s1, char * s2, int n, double x) 
{ 
    stringcopy(performers, s1); 
    stringcopy(label, s2); 
    selections = n; 
    playtime = x; 
} 

私は残念ながら
CD::CD(const CD & d) 
{ 
    stringcopy(performers, d.performers); 
    stringcopy(label, d.label); 
    selections = d.selections; 
    playtime = d.playtime; 
} 

など


、関数を使用すると、次のエラーメッセージが表示されます。pointer being freed was not allocated

if (to != 0) { delete [] to; }になると思います。


なぜこの行は非割り当てられたメモリを割り当て解除から保護しないのですか?

+0

'to'は' stringcopy() 'に対してローカルです。呼び出し側の(ポインタ)値を変更できるようにするには、参照渡しまたはポインタを渡す必要があります。 –

+0

@JohnBollinger - 私は 'char *'を使っていませんか?または、ダブルポインタを使用する必要がありますか? –

+0

'char *'を値渡ししています。 'stringcopy()'はそのポインタ値のコピーを使用してポインタが指す 'char'を修正しますが、あなたがする必要があるポインタの呼び出し元のコピーを変更することはできません。だから私が言ったように、ポインタを参照渡しするか、ポインタを渡す必要があります(つまり 'char **')。 –

答えて

1

あなたがここに

をやっている
if (to != 0) { delete [] to; } 
to = new char[size]; 

、新たにそれを割り当て、そこに文字列を格納し、これにローカル変数toポイントをメモリを解放しています。

しかし、この新しいローカルメモリアドレス(to1と呼ぶ)は、関数から返されないため、外部に公開されることはありません。関数getはtoのコピーです。これを修正するには、toをダブルポインタにする必要があります。ポインタへの参照。

+0

したがって、定義を 'char *&to'に変更することに加えて、私は何を変更するのですか? –

+0

はokでなければなりません – Matthias247

+0

私のコンパイラはそうでなければ教えてくれます。 ':)'ブロック内の何かを変更しますか? –

関連する問題