3

Windows で動作するコードがありますが、Xcode 3.2.5 C/C++ コンパイラ バージョン GCC 4.2 を使用して MAC に移植すると、クラッシュします。

memset 呼び出しに絞り込みました。memset をコメントアウトすると機能し、コードに戻すとクラッシュします。

ヘッダー ファイルに次のような構造があります。

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;

次に、cpp ファイルに次のように記述します。

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 でのみクラッシュするのはなぜですか?

ありがとう。

4

2 に答える 2

14

deviceIdの内部データをmemsetすべて上書きして上書きしています。POD データ型memset以外は何もしないでください。これは C++ で、コンストラクターがあります。コードは次のようになります。

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";
于 2012-01-04T01:52:11.977 に答える
11

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

于 2012-01-04T01:51:53.010 に答える