Я работаю над переносом некоторых в linux, и я обнаружил довольно интересную ошибку в коде, который, по-видимому, работает на окнах, но не на Linux. Класс с некоторыми членами строки инициализировался через memset(this)
, который, по-видимому, работает на окнах, но генерирует ошибку сегментации в linux в дескрипторе строк.Вы можете `memset()` над строкой в окнах?
Да, я знаю, используя memset()
, потому что это ужасная практика, и я ее исправляю.
SSCCE:
#include <iostream>
#include <cstring>
int main()
{
std::string tmp;
std::cout << "String instantiated" << std::endl;
memset(&tmp, 0, sizeof(tmp));
std::cout << "String memset" << std::endl;
return 0;
}
Это прекрасно работает на окнах, но строка деструкторов на ошибку сегментации Linux.
Составители:
- MSVC++ 2013 (Microsoft (R) C/C++ оптимизирующий компилятор версии 18.00.31101 для x64)
- г ++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Я понимаю, что это была (и есть) ужасная практика в любом случае, но как она когда-либо работала в первую очередь?
Что на земле было намерение здесь? Может быть, осталось, когда 'tmp' был массивом' char'? –
Ошибка, деталь реализации и ужас - почему вы спрашиваете (оставьте ее в покое)? –
@ ДжозефМансфилд - Нет ** ПРОСМОТР ** идея. Кодовая база ~ 50KLOC без комментирования C++. Мое предположение состоит в том, что у класса первоначально были только члены типа C (где это использование memset является функциональным, если это ужасно), а член строки был добавлен позже, не глядя на конструктор, и он как-то работает в любом случае. –