Должен ли заголовок, используемый для создания библиотеки, совпадать с заголовком, использующим библиотеку

После компиляции исходного кода в файлы .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, но он использует тот же заголовочный файл, который использовался для его компиляции.

2

Решение

Это плохо сформированная программа, и вы столкнулись с неопределенным поведением. Определение класса должно быть точно так же через переводческие единицы в программе — согласно 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,

6

Другие решения

В клиентском коде ваш объект имеет другой размер. Это перезапишет память, когда объект размещен в стеке или в куче.

1

По вопросам рекламы [email protected]