Статический объект не инициализирован в Mac OS X

//File A.h containing class A
//DLL or dylib code.
class A {
//Class methods
A ()
{
count = 5;
}

//Append is running fine as it is tested
A& Append (const A& a)
{
//Append operation.
str = str + a.str;
return *this;
}

//this is running fine in all other cases except for this static object.
A& operator= (const A& a)
{
//Statement 1
str = a.str;
//Problem is faced in the statement 1 on the assignment of str to a.str
//I forget to add this code.
count = a.count;
return *this;
}

private:
std::string str;
int count;
};

//File B.cpp in some other layer
//When these variables in dylib.
static A obj1;
static A obj2;
static void f ();
static void g ();

//This Initialize is called whenver DLL or dylib is being loaded.
Initialize ()
{
f();
g();
}

//Problem faced in a function f
void f ()
{
A a;

//Some operation performed on a
a.Append (GetA("String"));

//Here I am facing problem of Bad memory access possibly over statement 1.

obj1 = a;
//Debugger on Windows showing the member of obj1 initialized, but not on Mac OS X.
}

void g ()
{
A a;

//Some operation performed on a

//Here I am facing problem of Bad memory access possibly over statement 1.
obj2 = a;
//Debugger on Windows showing the member of obj1 initialized, but not on Mac OS X.
}

//The application An exe or .app on Mac OS X
int main ()
{
InitializeApplication ();

void * handle;
//Dynamic library is being loaded.
handle = dlopen("mylib.dylib", RTLD_LAZY);

//Functions are being loaded.
f1  = dlsym(handle, "MyFunction");

//Rest of the code.

}

Когда я запускаю аналогичную программу в Windows (скомпилированную с использованием компилятора cl), значения obj1.count и obj2.count равны 5 (как инициализировано конструктором по умолчанию).

Однако, когда я запускаю эту программу в Mac OS X (скомпилированной с использованием компилятора clang), значения obj1.count и obj2.count равны 0.

Я что-то упускаю для инициализации статического объекта класса? Какие шаги необходимы, если есть массив?

В моей программе есть приложение, загружающее dylib (в Mac OS X) или DLL (в Windows). Этот код является частью общей библиотеки или библиотеки DLL.

Статический объект obj1 и obj2 находятся в DLL. Эта DLL загружается и затем вызывается.

В Windows наблюдается следующее поведение

  1. Точки останова, установленные в объявлении статического класса obj1 и obj2, удаляются.
  2. Объект obj1 и obj2 инициализируются правильно.
  3. Точка останова, помещенная в конструктор, также попадает в цель.

В Mac OS X

  1. Точка останова в объявлении и в конструкторе не достигается из-за этого статического объявления.
  2. Объект obj1 и obj2 не инициализируются.

В Mac OS X все в объекте инициализируется нулем. Каждый адрес имеет значение NULL.

Однако, когда я переместил эти переменные в статическую библиотеку (которая связана с этим dylib), тогда все работает в соответствии с ожиданиями.

Есть ли проблема с глобальными / статическими объектами в dylib?

0

Решение

Так как ваш:

  A& operator= (const A& a)
{
//Statement 1
str = a.str;
}

не копирует countтогда мы можем ожидать «неопределенного» значения count в скопированном объекте. Который может быть проклят 5, но также некоторые другие значения. operator= следует скопировать (или иным образом инициализировать) ВСЕ содержимое класса.

Редактировать: И вы должны иметь return *this; и там тоже.

1

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

Других решений пока нет …

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