Статический объект не инициализирован в 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?


person doptimusprime    schedule 06.05.2013    source источник
comment
Просто запустите его. В моем случае в Mac OS X статические объекты obj1 и obj2 не инициализируются. Однако они были инициализированы в Windows в соответствии с конструктором по умолчанию. Из-за этого я сталкиваюсь с проблемой плохого доступа к памяти.   -  person doptimusprime    schedule 06.05.2013
comment
К obj1 = a; оба объекта должны были быть инициализированы.   -  person Eric Z    schedule 06.05.2013
comment
@ Эрик, я ожидаю того же. Это отлично работает в Windows. Но я столкнулся с проблемой в Mac OS X, где я вижу в отладчике, что эти объекты не инициализированы.   -  person doptimusprime    schedule 06.05.2013


Ответы (1)


Поскольку ваш:

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

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

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

person Mats Petersson    schedule 06.05.2013
comment
Спасибо за ответ. Я думаю, что я был не в состоянии сказать точную проблему. Я отредактировал вопрос. Это уже делается. Проблема в том, что статические объекты не инициализируются должным образом перед назначением. - person doptimusprime; 06.05.2013
comment
И что происходит, когда вы запускаете программу, которую вы разместили? Или только когда в реальном коде? - person Mats Petersson; 06.05.2013
comment
В реальном коде. Здесь я разместил минимальную часть кода. Остальной код является производственным. - person doptimusprime; 06.05.2013
comment
Я бы посоветовал вам сократить производственный код до минимума, запутать имена и опубликовать это. В этом может быть что-то отличное от того, что вы опубликовали, поскольку я не вижу ничего прямо неправильного. - person Mats Petersson; 06.05.2013
comment
Я думаю, что это код по минимуму. Основной вопрос, почему точки останова, помещенные в объявление статического объекта и, следовательно, в определение конструктора, не срабатывают. - person doptimusprime; 06.05.2013
comment
Нет, я не это имел в виду. Код, который вы разместили, действительно показывает проблему? - person Mats Petersson; 06.05.2013
comment
да. Проблема показана в коде. Вопрос в том, почему статические объекты не инициализируются. Даже если они будут инициализированы, я не написал никакого кода, чтобы обнулить их. Кроме того, точки останова, помещенные в конструктор, не срабатывают. Это означает, что конструктор для этого статического объекта не вызывается. - person doptimusprime; 06.05.2013
comment
После перемещения этих статических переменных в статическую библиотеку (.a) все работает нормально. Есть ли проблема со статическими переменными в dylib? - person doptimusprime; 07.05.2013