Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Gelo123321
21 / 21 / 4
Регистрация: 05.01.2012
Сообщений: 282
Завершенные тесты: 1
#1

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

29.08.2016, 12:48. Просмотров 212. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как передать указатель на структуру так, чтобы потом иметь возможность корректно удалить его? (C++):

Как передать указатель на структуру в функцию - C++
Подскажите как передать указатель *arr на структуру в функцию2, чтобы в ней использовать уже заполненные массивы: void func1() ...

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

Как сделать указатель на структуру и получить так доступ к элементам? - C++
Здравствуйте!Как сделать указатель на структуру и получить так доступ к элементам? #include <iostream> using namespace std; struct...

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

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

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

8
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,047
Записей в блоге: 17
29.08.2016, 13:02 #2
Для этого есть std::shared_ptr
1
Gelo123321
21 / 21 / 4
Регистрация: 05.01.2012
Сообщений: 282
Завершенные тесты: 1
29.08.2016, 13:08  [ТС] #3
Avazart, std::shared_ptr может работать с указателями, которые не определены в С++, а взяты со сторонних библиотек?
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,047
Записей в блоге: 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 / 4
Регистрация: 05.01.2012
Сообщений: 282
Завершенные тесты: 1
29.08.2016, 13:22  [ТС] #5
Avazart, Неправильно сформулировал вопрос.
Я имел в виду с типами данных, взятыми из других библиотек, например: Box2D, SDL etc.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,047
Записей в блоге: 17
29.08.2016, 13:23 #6
Почему нет?
Если память под них выделяется new/delete проблем не должно быть.
Если же удаляется иначе (не через delete) стоит указывать class Deleter в конструкторе см п 13

http://ideone.com/bHuRYS
0
Gelo123321
21 / 21 / 4
Регистрация: 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
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,047
Записей в блоге: 17
29.08.2016, 13:34 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
http://stackoverflow.com/questions/1...-stdshared-ptr
2
Gelo123321
21 / 21 / 4
Регистрация: 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
Привет! Вот еще темы с ответами:

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

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

Как передать массив в функцию так, чтобы при выходе из функции он не изменялся? - C++
Задачка: есть строка, которая состоит из символов. Символы соединяються в слова, которые оттделены друг от друга одним или несколькими...

Для типа данных unsigned long обеспечить возможность доступа как к числу целиком, так и отдельно к его битам - C++
Для типа данных unsigned long обеспечить возможность доступа как к числу целиком, так и отдельно к его битам с номерами 5, 8, 29.


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

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

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