0

私が書いたカスタム ベクトル テンプレートにキーボードから文字列のリストを読み込もうとしていますが、なんらかの理由で、ベクトル オブジェクトに読み書きしようとすると、2 回目または 3 回目の入力の後にプログラムが常にクラッシュします。

注: 割り当ての要点は、独自のカスタム ベクトル クラスを作成することであり、配列など、C++ STL によって提供される機能を使用することは許可されていません。

編集: int または char ベクトルにすると、すべて問題なく動作しますが、3 つすべてを実行する必要があります。

編集:私の講師が、良いコーディングの実践とはかけ離れた、ある種の混乱した方法でこれを強制しようとしていることがかなり明らかになりました. 助けてくれてありがとう、でも私はここでどこにもたどり着くとは思わない。なぜなら、あなたはみんな私に正しいことを言っているからであり、私の講師が正しいことを望んでいないことは明らかだ。彼は自分が決めたことを正しいと思っているもの。

4

3 に答える 3

3

newdelete[]の代わりにmallocとを使用しfreeます。なんで?

  • new作成されたオブジェクトのコンストラクタとデストラクタをdelete呼び出します。たとえば、

    string * str = new string("foo");
    

    ヒープ上に文字列型のオブジェクトを作成し、それへのポインタを返します。

    delete str;
    

    デストラクタを呼び出して、メモリを解放します。

  • mallocfreeは C のメモリ管理関数であるため、コンストラクタとデストラクタについてはわかりません。それらが行うことは、ヒープからメモリのチャンクを取得して返すことだけです。

    string * str = (string*) malloc(sizeof(string));
    

    文字列オブジェクトと同じ大きさの初期化されていないメモリのチャンクが得られます。 コンストラクターは呼び出されません。作成されたオブジェクトの適切な操作は、適切な初期化に依存する可能性が高いため、エラーが発生する可能性があります(ほとんどの場合、エラーが発生します)(あなたmyvectorが良い例です)。との状況freeは左右対称です。

于 2012-04-18T09:28:46.367 に答える
2

When allocating memory for the elements you cannot use malloc for non-POD types - you need to call constructor for such type by using new. E.g. you cannot malloc memory for a std::string object and then use operator= to copy string (in whatever magical way) to returned address.

于 2012-04-18T09:30:11.603 に答える
0

と絶対に混ぜないnew/deleteでくださいmalloc/free/realloc。また、malloc/free/reallocPOD 以外の型 ( などstd::string) では、未定義の動作が発生します。あなたのコードは危険であり、実行時の動作が定義されていません。

あなたの上司がそれらの使用を主張する場合は、C++ の真の方法について彼に教えるようにしてください。または、アプリケーションがいつかクラッシュすることを受け入れるか (そして、バグを追跡するのに恐ろしい時間を費やすことになります)、または仕事を辞めるか、または、あなたが大きなナッツを持っているなら、あなたの上司の上司に行って彼に言ってください

さらに、次のものがあります。

#include <stdlib.h>
#include <string.h>

を参照している場合、これは標準 C++ ではありませんstd::string。使用する

#include <cstdlib>
#include <string>

さらに、標準コンテナの使用は許可されていないとコメントで述べています。それでもstd::string、コンテナである を使用しているようです。

さらに別のこと:using namespace std;ヘッダー内は本当に悪い習慣であり、遅かれ早かれデバッグが困難な名前の競合につながります。

繰り返し ますが、POD 以外の型で使用new/malloc/reallocすると、プログラムが定義済みの動作を失うことになります。ブラックホールの地平線のようなものです。

于 2012-04-18T10:02:26.523 に答える