Когда C ++ Destructor для глобальной переменной будет вызываться в NDK? - PullRequest
3 голосов
/ 21 октября 2011

Недавно я столкнулся со странной проблемой при компиляции консольной программы Android с использованием NDK.

Класс объявлен так:

class ClassP
{
public:
    ~ClassP()
    int number;
}
ClassP::~ClassP()
{
    printf("number=%d", number);
}

Основная функция выглядит так:

// global variable
ClassP p_instance;

int main()
{
    printf("test");
}

Когда программа будет выполнена, она выдаст

test
Segmentation fault

После некоторой базовой отладки я обнаружил, что когда вызывается деструктор ClassP, адрес его номера переменной-члена равен 0Я думаю, это потому, что p_instance каким-то образом освобождается до вызова деструктора.Но поведение не то, что я ожидал.Разве деструктор глобальных переменных не вызывается, когда процесс завершается, и система пытается освободить все объекты?

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

Глобальные переменные уничтожаются, когда их процесс закрывается или , когда их модуль / dll выгружается.

Я бы предположил, что ваша проблема в том, как вы регистрируете свой модуль с помощью NDK, похоже, ваш код либо НЕ объявлен как глобальная переменная, как вы предполагаете (то есть он фактически вызывается в области видимости ), или модуль загружается, выгружается, затем ваша функция как-то вызывается.

Взгляните на некоторые из примеров NDK в SDK и посмотрите, делаете ли вы что-то очень простое; потому что ваш код в том виде, как он есть, в порядке.

1 голос
/ 21 октября 2011
class ClassP
{
    public:
        ~ClassP();
        int number;
};
ClassP::~ClassP()
{
    printf("number=%d", number);
}

// global variable
ClassP p_instance;

int main()
{
    printf("test");
}

Добавить пропущенные точки с запятой

После класса def и после класса destructor и и деструктор работает нормально

Ps вывод = номер теста = 0

...