Форум программистов, компьютерный форум CyberForum.ru

Память под объекты через new - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ basic_istream::getline http://www.cyberforum.ru/cpp-beginners/thread627403.html
Всем здравствуйте. Изучаю С++ по книге Р. Лафоре в главе 7 массивы и строки есть задание которое предполагает получение строки, содержащей пробелы в переменную типа string и тут при выполнении задания я столкнулся с непонятным поведением функции basic_istream::getline вот пример кода который показывает проблему: #include <iostream> #include <string> using namespace std; const int...
C++ Не могу найти ошибку (std::thread) В цикле добавляю в свой класс несколько задач, всегда получается разный результат, иногда вылетает исключение о недействительности итератора дека. #ifndef _NFTASK_MANAGER_HPP #define _NFTASK_MANAGER_HPP #include <thread> #include <deque> #include <vector> #include <new> http://www.cyberforum.ru/cpp-beginners/thread627401.html
Подбор литературы. Для повышенного уровня C++
Привет. Освоил книгу страуструпа для новичков. Подскажите куда двигаться дальше? Разработка приложений информационной безопасности. Взаимодействие с операционной системой проще говоря. Простите что выглядит пост по детски, мой опыт в программировании 14 дней. Время до октября.
В одномерном массиве, состоящем из n вещественных элементов, вычислить сумму отрицательных элементов массива C++
Прошу помочь с моей задачей.Я только-только начал изучать С++ и у меня возникли трудности задача В одномерном массиве, состоящем из n вещественных элементов, вычислить: 1)сумму отрицательных элементов массива 2)произведение элементов массива, расположенных между максимальным и минимальным элементами. Упорядочить элементы массива по возрастанию. Пишу на dev-c++ Код
C++ graphics.h - сохранение изображения http://www.cyberforum.ru/cpp-beginners/thread627384.html
Мне нужно, что бы можно было как-нибудь сохранить изображение определённой области экрана (например от х 100 у 100 до х 200 до у 200) И потом это изображение снова вставить в эту же программу
C++ Ширина (высота) окна winapi Подскажите как узнать ширину (высоту) окна? подробнее

Показать сообщение отдельно
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.07.2012, 04:53     Память под объекты через new
Цитата Сообщение от edward_jonson Посмотреть сообщение
A* c = NULL;
A* d = NULL;
Без этого, MSVC ошибку при выполнении выдаёт: обращение к неинициализированнной переменной в строках 21 и 22, если продолжить, то адреса: СССССССС, СССССССС. mingv пропускает и выдаёт: 0x100, 0x4016dd. Вывод: желательно писать, или, хотя бы не обращаться к переменным до инициализации.

Цитата Сообщение от edward_jonson Посмотреть сообщение
A* a = new A;
//и
A* a = new A()
Без разницы. Конструктор по умолчанию.

Цитата Сообщение от edward_jonson Посмотреть сообщение
Да и вообще, принципиальной разницы между
a->my = 4;
f.my = 5;
нету, да?(Я понимаю, что в первом случае обращение идёт через указатель, а во втором напрямую.) И какой из этих вариантов наиболее часто используется в практике?
Разница в том, что в первом случае указатель, а во втором объект. В практике используется тот, который нужен. К объекту -> не приделаешь. Другое дело, что первый пример можно записать двумя способами: a -> my = 4; или (*a).my = 4; Тут, действительно, принципиальной разницы нет. Пусть эксперты скажут, для хорошего стиля программирования, какой лучше ?

Цитата Сообщение от edward_jonson Посмотреть сообщение
Куски памяти под a и b распределяются друг за другом, а под c и d совсем в разных местах.
Тут нужно разделить понятия: память под переменные a, b, c, d (под указатели) и память под то, на что эти указатели указывают. У вас у коде, а и b содержат адреса в динамической области памяти, по которым находятся созданные объекты класса А, а с и d не на что не указывают, в них, по идее, "мусор" должен быть (поэтому разные компиляторы по разному и обрабатывают вывод их содержимого через cout <<). Чтобы узнать адреса самих переменных нужно написать:
C++
1
2
3
4
std::cout << &a << std::endl
              << &b << std::endl
              << &c << std::endl
              << &d << std::endl;
Под них память выделена подряд, и (если я неправ, пусть поправят) в стеке. Если же так написать:
C++
1
2
3
4
5
6
7
8
A* a = new A();
A* b = new A;
A c;
A d;
std::cout << a << std::endl
          << b << std::endl
          << &c << std::endl
          << &d << std::endl;
, то выведутся адреса динамической памяти, содержащиеся в a и b , и адреса объектов c и d, созданных в автоматической области памяти (в стеке).
 
Текущее время: 14:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru