Перейти к содержанию
    

Вопрос по С++

Вопрос к знатокам. Компилятор IARAVR v4.12. Столкнулся со следующим эффектом,в случае объявления объекта глобальным статическим все нормально работает

 

Tobj obj;

 

int main()

{

..........

}

 

А если объявить его так:

 

Tobj* obj = new Tobj;

 

int main()

{

..........

}

 

не работает. Естественно методы в этом случае вызываются через указатели.

Игра настройками HEAP, CSTACK, RCTACK ни к чему не приводит. Впервые на такое налетел.

Подскажите где я туплю. В map. файлах все практически одинаково, предупреждений нет.

Нужно по структуре программы работать через указатели.

По смыслу примерно так (конструктор вызывается в теле:

 

Tobj* obj ;

 

int main()

{

..........

obj = new Tobj;

 

..........

}

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А кто мешает сделать так:

 

Tobj Obj;
Tobj* obj = &Obj;

int main()
{
..........
}

 

Всегда будет работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что именно не работает? Память не выделяется? Конструктор не вызывается? Указатель на неверный адрес указывает?

 

Что-то типа int *a = new int[10]; работает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то типа int *a = new int[10]; работает?

 

Автор хочет, чтобы это работало до main(). A это невозможно. Внутри любой функции - пожалуйста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что именно не работает? Память не выделяется? Конструктор не вызывается? Указатель на неверный адрес указывает?

 

Что-то типа int *a = new int[10]; работает?

 

Судя по всему не вызывается коструктор. Так ведь в куче проектах работает именно третий вариант, указатель на объект глобальный а требуемый конструктор, определяемый например по опросу ключа, вызывается в main. Если я правильно понимаю, что если бы были проблемы с недостатком памяти не работал бы и глобальный объект.

 

Автор хочет, чтобы это работало до main(). A это невозможно. Внутри любой функции - пожалуйста.

Поясните, почему, хочется глобальным иметь указатель на объект, а конструктор вызывать где надо и удалять объект (по необходимости ) где надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поясните, почему, хочется глобальным иметь указатель на объект, а конструктор вызывать где надо и удалять объект (по необходимости ) где надо.

 

Вы же написали:

 

Tobj* obj = new Tobj;

int main()
{
..........
}

 

Именно это в таком виде не может работать.

 

Вы путаете объявление объекта и его создание.

 

Tobj* obj;  // объявление указателя на объект, указателя с глобальной вивдимостью

int main()
{
  obj = new Tobj; // создание объекта (вызов конструктора, в данном случае)
                          // и передача адреса созданного обьекта указателю с глобальной видимостью
..........
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы же написали:

 

Tobj* obj = new Tobj;

int main()
{
..........
}

 

Именно это в таком виде не может работать.

 

Вы путаете объявление объекта и его создание.

 

Tobj* obj;  // объявление указателя на объект, указателя с глобальной вивдимостью

int main()
{
  obj = new Tobj; // создание объекта (вызов конструктора, в данном случае)
                          // и передача адреса созданного обьекта указателю с глобальной видимостью
..........
}

 

Последний вариантом я всегда и пользовался, см. предыдущий мой пост. Не работает он в конкретном случае и я не могу понять почему, игра с "кучей" и стеками результатов не дала. В map файле ничего криминального не увидел, предупреждений ни кампилятор, ни линкер не выдает. Работает только глобальный статически созданный объект. А первое Ваше утверждение весьма спорно.

в глобальной области строка

Tobj* obj = new Tobj;

включает в себя и объявление и создание объекта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Именно это в таком виде не может работать.

В плоском С не может, в С++ может, должно и работает именно в таком виде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В плоском С не может, в С++ может, должно и работает именно в таком виде.

 

Век живи - век учись. Действительно работает, прошу прощения за дезу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...