Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Gelo123321
21 / 21 / 8
Регистрация: 05.01.2012
Сообщений: 282
Завершенные тесты: 1
1

Как передать указатель на структуру так, чтобы потом иметь возможность корректно удалить его?

29.08.2016, 12:48. Просмотров 892. Ответов 8
Метки нет (Все метки)

Есть класс в котором содержится указание на некоторую структуру данных. Этот указатель передается в другие классы. Однако, я делаю это некорректно, из-за чего и происходят утечки памяти.

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Engine
{
    public:
        Engine() {;}
        ~Engine() {delete pointer;}
        int *getPointer() {return pointer;}
    private:
        int *pointer;
};
 
class Box
{
    public:
        Box() {;}
        ~Box() {//delete pointer;}
        void setPointer(int* POINTER) {pointer = POINTER;}
    private:
        int *pointer;
};
 
int main(int argc, char *argv[])
{
    Engine *engine = new Engine();
    Box *box = new Box();
    box->setPointer(engine->getPointer());
 
    delete box;
    delete engine;
    
    return 0;
}


Освобождение памяти не происходит должным образом.

В каждом классе я создаю указатель того же типа для хранения адреса, что уже само по себе - неправильно, так как у меня теперь есть два указателя, которые содержат одинаковую информацию. В результате удаления указателя из класса Box - удаляется указатель и из класса Engine.

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

Как передать указатель на структуру так, чтобы потом иметь возможность корректно удалить его?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2016, 12:48
Ответы с готовыми решениями:

Как передать указатель на структуру в функцию
Подскажите как передать указатель *arr на структуру в функцию2, чтобы в ней использовать уже...

Как передать в функцию указатель на структуру, если эта структура не определена глобально?
Проблема заключается в следующем: предположим есть некая структура, которая была определена внутри...

Как сделать указатель на структуру и получить так доступ к элементам?
Здравствуйте!Как сделать указатель на структуру и получить так доступ к элементам? #include...

Как передать указатель функции, чтобы значение переменной изменилось?
Имеются переменная и указатель на нее. int x, *y = &x; Как передать указатель ф-ии, чтобы...

как сделать так чтобы была возможность записывать и фамилию и имя,а то у меня только до пробела читает?
здраствуйте!скажите пож-та как сделать так чтобы была возможность записывать и фамилию и имя,а то у...

8
Avazart
Эксперт С++
7724 / 5633 / 549
Регистрация: 10.12.2010
Сообщений: 25,406
Записей в блоге: 17
29.08.2016, 13:02 2
Для этого есть std::shared_ptr
1
Gelo123321
21 / 21 / 8
Регистрация: 05.01.2012
Сообщений: 282
Завершенные тесты: 1
29.08.2016, 13:08  [ТС] 3
Avazart, std::shared_ptr может работать с указателями, которые не определены в С++, а взяты со сторонних библиотек?
0
Avazart
Эксперт С++
7724 / 5633 / 549
Регистрация: 10.12.2010
Сообщений: 25,406
Записей в блоге: 17
29.08.2016, 13:20 4
Не понял вопроса.
Что значит "указатели не определенные в С++" ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <memory>
 
class Engine
{
    public:
        Engine():pointer_(new int(0)){}
        ~Engine() {}
        const std::shared_ptr<int>& getPointer()const {return pointer_;}
    private:
         std::shared_ptr<int>  pointer_;
};
 
class Box
{
    public:
        Box() {}
        ~Box() {}
        void setPointer(std::shared_ptr<int> pointer) {pointer_ = pointer;}
    private:
        std::shared_ptr<int>  pointer_;
};
 
int main(int argc, char *argv[])
{
    Engine *engine = new Engine();
    Box *box = new Box();
    box->setPointer(engine->getPointer());
 
    delete box;
    delete engine;
    
    return 0;
}
0
Gelo123321
21 / 21 / 8
Регистрация: 05.01.2012
Сообщений: 282
Завершенные тесты: 1
29.08.2016, 13:22  [ТС] 5
Avazart, Неправильно сформулировал вопрос.
Я имел в виду с типами данных, взятыми из других библиотек, например: Box2D, SDL etc.
0
Avazart
Эксперт С++
7724 / 5633 / 549
Регистрация: 10.12.2010
Сообщений: 25,406
Записей в блоге: 17
29.08.2016, 13:23 6
Почему нет?
Если память под них выделяется new/delete проблем не должно быть.
Если же удаляется иначе (не через delete) стоит указывать class Deleter в конструкторе см п 13

http://ideone.com/bHuRYS
0
Gelo123321
21 / 21 / 8
Регистрация: 05.01.2012
Сообщений: 282
Завершенные тесты: 1
29.08.2016, 13:27  [ТС] 7
Avazart, а если память выделяется другим способом? К примеру:
C++
1
2
3
4
5
6
7
SDL_Renderer *render;
render = SDL_CreateRenderer(window,
        -1,
        SDL_RENDERER_ACCELERATED |
        SDL_RENDERER_PRESENTVSYNC);
 
SDL_DestroyRenderer(render);
0
Avazart
Эксперт С++
7724 / 5633 / 549
Регистрация: 10.12.2010
Сообщений: 25,406
Записей в блоге: 17
29.08.2016, 13:34 8
Лучший ответ Сообщение было отмечено Gelo123321 как решение

Решение

http://stackoverflow.com/questions/1...-stdshared-ptr
2
Gelo123321
21 / 21 / 8
Регистрация: 05.01.2012
Сообщений: 282
Завершенные тесты: 1
29.08.2016, 13:37  [ТС] 9
Avazart, Спасибо. Тему можно закрывать.
0
29.08.2016, 13:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2016, 13:37

Как сделать так чтобы при каждом выделении памяти в методе была возможность ее очистить и вернуть результат?
Доброго времени суток! Есть код класса и хотелось бы устранить в нем следующие недочеты: 1) Как...

как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным?
const int size = 256; struct MARKER { char mark; } void processing(MARKER struct_m) {...

Не могу разобраться как передать корректно передать массив из функции в функцию
//--------------------------------------------------------------------------- #pragma hdrstop ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru