После компиляции исходного кода в файлы .o и использования «ar rcs libMyLibrarylib.a * .o» для создания библиотеки я получаю segfaults, потому что я использую заголовочный файл с чередующимися переменными-членами и частными функциями. Когда я использую точно такой же заголовок, я не получаю ошибки. Сегфаулты возникают при удалении указателей на карте.
#include <**Type**>
class A
{
public:
A();
~A(); //In the destructor I iterate through the map to free everything before
void function();
private:
void privateFunction();
std::map<**Type**, int*> myMap;
}
class A
{
public:
A();
~A();
void function();
}
Есть ли нарезка или что-то, когда не используется точный заголовочный файл? Я хочу скрыть Тип от того, кто использует библиотеку.
У меня есть модульные тесты для библиотеки, это не segfault, но он использует тот же заголовочный файл, который использовался для его компиляции.
Это плохо сформированная программа, и вы столкнулись с неопределенным поведением. Определение класса должно быть точно так же через переводческие единицы в программе — согласно 3.2 Одно правило определения [basic.def.odr] \ 6.
Чтобы скрыть включение Type, вы можете просто использовать идиому PIMPL и не прибегать к этим типам хаков.
class AImpl;
class A
{
public:
A();
~A(); //In the destructor I iterate through the map to free everything before
void function();
private:
AImpl* pImpl;
}
Вы просто перемещаете все элементы логики и данных внутри AImpl
и держите публичный интерфейс как можно более чистым. И все, что вам нужно, это предварительная декларация AImpl
,
В клиентском коде ваш объект имеет другой размер. Это перезапишет память, когда объект размещен в стеке или в куче.