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

О перевыделении памяти для массива объектов - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ сортировка вектора sort() http://www.cyberforum.ru/cpp-beginners/thread929937.html
программа заполняет вектор рандомными числами в диапазоне от 1 до 100 сортирует с помощью алгоритма sort(.begin(),.end()) - в восходящем порядке можно ли отсортировать с помощью sort() - в нисходящем порядке? #include <iostream> using namespace std; #include <ctime> #include <vector>
C++ Как работать с ресурсами? Visual C++ Как запихнуть .exe файл в программу и из программы считать .exe файл...? чтобы в итоге один .exe содержал другой .exe и мог последний извлекать... http://www.cyberforum.ru/cpp-beginners/thread929936.html
Подскажите как прекратить чтение из файла? C++
Есть программа: #include<iostream> #include<fstream> using namespace std; int main() { ifstream cin("in.txt"); int name; while(true) {
Механизмы онлайн игр C++
Как в онлайн играх происходит одновременое отображение действий персонажа, к примеру, на всех экранах играющих? Игрок, к примеру, нажимает на какое-то умение, информация об этом отправляется на сервер, а сервер высылает всем игрокам строку типа "игрок:id111;действие:id10;" и все игроки обрабатывают эту строку и прорисовыва.т нужное действие, так? если так, то как можно снизить нагрузку на...
C++ Калькулятор в книге Страуструпа http://www.cyberforum.ru/cpp-beginners/thread929886.html
Я знал, что это довольно тяжелая книга, поэтому начал читать ее после другой о С++, но пример "элементарного" калькулятора поставил меня в тупик с первых же строк. В этой теме я буду задавать вопросы относительно него по частям. Вот с самого начала: это всё вообще что? Даже не псевдокод, почему END в начале? Что за выражения? Что за термы? Первичное? Выражения? Прочитал весь пример, и так...
C++ Определение количества разрядов у числа Написал программку, которая должна определять количество разрядов у чисел. При вводе двухзначных и трехзначных, программа правильно определяет разряд, но при вводе четырехзначных чисел и более, начинает определять неправильно. Помогите определить проблему. #include<iostream> using namespace std ; int main() { int dvoich, chislo,razryd = 0, del = 1; cout << "Enter 2-oe chislo: " ; cin... подробнее

Показать сообщение отдельно
CatsCanFly
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 21
03.08.2013, 11:57  [ТС]     О перевыделении памяти для массива объектов
Olivеr, Спасибо, но у меня почему то нет функции make_move_iterator (конечно, файл <iterator> подключен). Использую VC++ 2008, как я понял из гугла, make_move_iterator есть только в новом стандарте, который 2008 студией не поддерживается. А можно показать пример максимально простой? STL я еще не изучал, и использовать ее не желательно к тому же, необходимо изучить максимально подробно работу с памятью для объектов, а не пользоваться готовыми решениями STL (задача то не практическая а в целях изучения).
Суть такова, у меня есть класс, который является максимальноп простой реализацией динамического расширяемого массива объектов, например:
C++
1
2
3
4
5
6
7
8
9
10
11
class CArray
{
private:
    SomeClass* arr;
    size_t size;
    CArray() : size(10)
    {
        arr = new SomeClass[10];
    }
    //...
}
Сам класс SomeClass так же содержит в себе указатель на динамический массив и освобождает от него память в своем деструкторе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class SomeClass
{
    int* smth;
    SomeClass()
    {
        smth = new int[20];
    }
    //...
    ~SomeClass()
    {
        delete[] smth;
    }
}
Допустим, мы создаем метод void resize(size_t new_size); для CArray, где копируем содержимое массива в выделенный массив нового размера и удаляем старый:
C++
1
2
3
4
5
6
void CArray::resize(size_t new_size)
{
    SomeClass* temp = new SomeClass[new_size];
    memcpy(temp, this->arr; sizeof(SomeClass) * new_size); // ??? не уверен что так хорошо делать
    delete[] arr;
}
Так вот, при удалении старого массива в этом методе вызовется и деструктор для объектов класса SomeClass, в котором будет освобождена память в которой хранились его собственные массивы, что в результате делает копирование бессмысленным - указатели в скопированных на новое место объектах остались, а память на которую они указывали мы потеряли. С другой стороны отказываться от освобождения памяти в деструткоре SomeClass нельзя, это необходимо в остальных случаях его использования. Надеюсь я понятно объяснил суть своей проблемы. Как понимаю, самый логичный ответ - не вызывать в методе resize деструкторы для содержащихся в массиве объектов, но вот как это сделать? И правильно ли это? В общем, подскажите как решить эту проблему, желательно максимально подробно и без использования готовых решений из stl и других библиотек, а так, что бы было понятно, как это работает на самом деле. Буду очень сильно благодарен
 
Текущее время: 17:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru