VladimirYU 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Вопрос к знатокам. Компилятор IARAVR v4.12. Столкнулся со следующим эффектом,в случае объявления объекта глобальным статическим все нормально работает Tobj obj; int main() { .......... } А если объявить его так: Tobj* obj = new Tobj; int main() { .......... } не работает. Естественно методы в этом случае вызываются через указатели. Игра настройками HEAP, CSTACK, RCTACK ни к чему не приводит. Впервые на такое налетел. Подскажите где я туплю. В map. файлах все практически одинаково, предупреждений нет. Нужно по структуре программы работать через указатели. По смыслу примерно так (конструктор вызывается в теле: Tobj* obj ; int main() { .......... obj = new Tobj; .......... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба А кто мешает сделать так: Tobj Obj; Tobj* obj = &Obj; int main() { .......... } Всегда будет работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
neiver 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба А что именно не работает? Память не выделяется? Конструктор не вызывается? Указатель на неверный адрес указывает? Что-то типа int *a = new int[10]; работает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Что-то типа int *a = new int[10]; работает? Автор хочет, чтобы это работало до main(). A это невозможно. Внутри любой функции - пожалуйста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба А поместить в lowlevelinit не спасёт (не проверял)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Segment 3 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Дык static модификатор должен помочь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Дык static модификатор должен помочь static здесь каким боком? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба А что именно не работает? Память не выделяется? Конструктор не вызывается? Указатель на неверный адрес указывает? Что-то типа int *a = new int[10]; работает? Судя по всему не вызывается коструктор. Так ведь в куче проектах работает именно третий вариант, указатель на объект глобальный а требуемый конструктор, определяемый например по опросу ключа, вызывается в main. Если я правильно понимаю, что если бы были проблемы с недостатком памяти не работал бы и глобальный объект. Автор хочет, чтобы это работало до main(). A это невозможно. Внутри любой функции - пожалуйста. Поясните, почему, хочется глобальным иметь указатель на объект, а конструктор вызывать где надо и удалять объект (по необходимости ) где надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Поясните, почему, хочется глобальным иметь указатель на объект, а конструктор вызывать где надо и удалять объект (по необходимости ) где надо. Вы же написали: Tobj* obj = new Tobj; int main() { .......... } Именно это в таком виде не может работать. Вы путаете объявление объекта и его создание. Tobj* obj; // объявление указателя на объект, указателя с глобальной вивдимостью int main() { obj = new Tobj; // создание объекта (вызов конструктора, в данном случае) // и передача адреса созданного обьекта указателю с глобальной видимостью .......... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 13 января, 2011 Опубликовано 13 января, 2011 · Жалоба Вы же написали: Tobj* obj = new Tobj; int main() { .......... } Именно это в таком виде не может работать. Вы путаете объявление объекта и его создание. Tobj* obj; // объявление указателя на объект, указателя с глобальной вивдимостью int main() { obj = new Tobj; // создание объекта (вызов конструктора, в данном случае) // и передача адреса созданного обьекта указателю с глобальной видимостью .......... } Последний вариантом я всегда и пользовался, см. предыдущий мой пост. Не работает он в конкретном случае и я не могу понять почему, игра с "кучей" и стеками результатов не дала. В map файле ничего криминального не увидел, предупреждений ни кампилятор, ни линкер не выдает. Работает только глобальный статически созданный объект. А первое Ваше утверждение весьма спорно. в глобальной области строка Tobj* obj = new Tobj; включает в себя и объявление и создание объекта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
forever failure 0 13 января, 2011 Опубликовано 13 января, 2011 · Жалоба Именно это в таком виде не может работать. В плоском С не может, в С++ может, должно и работает именно в таком виде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 13 января, 2011 Опубликовано 13 января, 2011 · Жалоба В плоском С не может, в С++ может, должно и работает именно в таком виде. Век живи - век учись. Действительно работает, прошу прощения за дезу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться