memset вызывает сбой при назначении std :: string - PullRequest
3 голосов
/ 04 января 2012

У меня есть код, который работает в Windows, но теперь, когда я портирую на MAC, с помощью компилятора Ccode C / C ++ версии Xcode 3.2.5 GCC 4.2, происходит сбой.

Я сузил его до вызова 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 в строке назначения и только в MAC?

Спасибо.

Ответы [ 2 ]

14 голосов
/ 04 января 2012

Вы перезаписываете внутренние данные deviceId, выполняя memset все это; никогда не делайте memset над чем-либо, кроме POD типа данных . Это 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";
11 голосов
/ 04 января 2012

Недопустимо в C ++ вызывать memset() с типом данных, отличным от POD . Структуры, содержащие std::string членов, не являются POD.

...