2012-01-04 11 views
3

私はWindows上で動作するコードを持っていますが、Xcode 3.2.5 C/C++コンパイラのバージョンGCC 4.2を使用してMACに移植しています。memsetはstd :: stringの割り当てでクラッシュを引き起こしています

私はそれをmemset呼び出しに絞りました。私がmemsetをコメントアウトすると動作し、コードをクラッシュさせて戻します。

私は私のヘッダファイルに次のようになります構造:次に、CPPファイルで、私はこの持ち

typedef struct 
{ 
    int deviceCount; 
    struct 
    { 
     #define MAX_DEVICE_ID 256 
     #define MAX_DEVICE_ENTRIES 10 
     std::string deviceId; // Device name to Open 
     TransportType eTransportType; 
    } deviceNodes[MAX_DEVICE_ENTRIES]; 
} DeviceParams; 

を:

DeviceParams Param; 
memset(&Param, nil, sizeof(Param)); 

を後で私はこれを持っています...

pParam->deviceNodes[index].deviceId = "some string"; // <----- Line that crashes with memset 

私がmemset呼び出しを削除すると前に言ったように、すべて正常に動作します。私がmemsetを呼び出す前に私がデバッガを見ると、構造体の文字列は\ 0であり、memsetの後はnilです。

割り当て線でnil文字列がクラッシュするのはなぜですか?MACでのみですか?

ありがとうございました。

+2

:あなたのコードは次のようになります。 :string'は全てのNULLポインタにセットされたときに無効になる。クラスに(実際の定義を持つコンストラクタのような)些細でないコンストラクタを持つメンバが含まれている場合、そのコンストラクタは、トリビアルなコンストラクタを持つメンバをゼロにするとともに、非自明のコンストラクタを呼び出すように定義されます。だから 'eTransportType'について心配しないでください。もちろん、ネストされた型に名前を付けてそのコンストラクタを定義し、 'memset'を避けるのが最善の方法です。 – Potatoswatter

+2

ルールを破ると、時々あなたはそれを忘れてしまいます。 –

答えて

14

memsetを全面的に実行して、deviceIdの内部データを上書きしています。 POD data type以外は何も上にmemsetを実行しないでください。これはC++で、コンストラクタがあります。 STD `の内部状態ので、それは(GCCを使用して可能性の任意のプラットフォームをして)Macでクラッシュ...ただ、回答に詳しく説明する

struct DeviceParams 
{ 
    int deviceCount; 

    struct DeviceNode 
    { 
     DeviceNode() : eTransportType() { } // initialise eTransportType 
              // to 0, deviceId initialises itself 

     static const int MAX_DEVICE_ID = 256; 
     static const int MAX_DEVICE_ENTRIES = 10; 

     std::string deviceId; // Device name to Open 
     TransportType eTransportType; 
    } deviceNodes[DeviceNode::MAX_DEVICE_ENTRIES]; 
}; 

その後

DeviceParams Param; 

// get a pointer to Param in pParam 

pParam->deviceNodes[index].deviceId = "some string"; 
11

memset()PODデータ型で呼び出すことは無効です。 std::stringのメンバーを含む構造はPODではありません。

関連する問題