1

Тема: Чи видалиться вказівник?

Маю об'єкт типу std::pair. Один із його членів є вказівник, пам'ять якому була надана через new.
Питання таке: як працює pair? Тобто оскільки його членам пофіг(вони - шаблонові типи) хто вони є, має викликатися звичайний деструктор. Чи можна, в даному випадку, назвати delete деструктором?  Якщо я буду використовувати std::pair як boost::tr1::shared_ptr, протікання не буде?

2 Востаннє редагувалося koala (09.01.2014 16:30:07)

Re: Чи видалиться вказівник?

incred написав:

Маю об'єкт типу std::pair. Один із його членів є вказівник, пам'ять якому була надана через new.

Вказівнику пам'ять не надається. Вказівник вказує на ділянку, виділену за допомогою new.

incred написав:

Питання таке: як працює pair?

template<
    class T1,
    class T2
> struct pair
{
  T1 first;
  T2 second;
};

І ото, власне, все.

incred написав:

Тобто оскільки його членам пофіг(вони - шаблонові типи) хто вони є, має викликатися звичайний деструктор.

Ви хотіли спитати - в разі знищення вашого pair? Ну так, будуть викликані деструктори обох половинок, якщо вони існують.

incred написав:

Чи можна, в даному випадку, назвати delete деструктором?

Звісно ні, з якого це дива? Деструктор - це особливий член, що викликається при знищенні об'єкту. Звідкіля члени в стандартного вказівника? І як стандартна функція може раптом стати членом класу?

incred написав:

Якщо я буду використовувати std::pair як boost::tr1::shared_ptr, протікання не буде?

Якщо ви будете використовувати літак як підводний човен, протікання не буде? Чи ви щось інше хотіли спитати?

Подякували: Chemist-i, incred2

3

Re: Чи видалиться вказівник?

koala написав:
incred написав:

Чи можна, в даному випадку, назвати delete деструктором?

Звісно ні, з якого це дива? Деструктор - це особливий член, що викликається при знищенні об'єкту. Звідкіля члени в стандартного вказівника? І як стандартна функція може раптом стати членом класу?

Ви мене неправильно зрозуміли: чи буде виконуватися операція delete, чи залишиться пам'ять зайнятою при знищенні самого об'єкту типу pair?

koala написав:
incred написав:

Якщо я буду використовувати std::pair як boost::tr1::shared_ptr, протікання не буде?

Якщо ви будете використовувати літак як підводний човен, протікання не буде? Чи ви щось інше хотіли спитати?

Тут я мав на увазі, чи є у цих класів схожа функція, а в загальному вигляді так: як знищуються вказівники опосередковано.

А щодо цього, то я знайшов відповідь таким прикладом.
Ось:

#include <iostream>
#include <utility>
#include <conio.h>

using namespace std;

class a {
    static int total;
    int id;
public:
    a(): id(total++) {
        cout<<"An a-objrct was created! its index: "<<id<<endl;
    }
    a(const a& i): id(total++) {
        cout<<"The a-object with index "<<i.id
            <<" has been successfully copied!"<<endl;
    }
    ~a() {
        cout<<"The a-object with index "<<id
            <<" has been successfully destroyed!"<<endl;
    }
};

int a::total = 1;

int main() {
    
    a* x = new a;
    cout<<"pointer is created"<<endl;
    _getch();
    pair<a*, a>* p1 = new pair<a*, a>(x, *x);
    delete p1;
    _getch();
    return 0;
}

Результат програми такий:
An a-objrct was created! its index: 1
pointer is created
The a-object with index 1 has been successfully copied!
The a-object with index 2 has been successfully destroyed!

Подякували: koala1

4

Re: Чи видалиться вказівник?

incred написав:

Ви мене неправильно зрозуміли: чи буде виконуватися операція delete, чи залишиться пам'ять зайнятою при знищенні самого об'єкту типу pair?

Якщо знищується вказівник, то це ніяк не стосується того, на що він вказує. Якщо знищується pair<a*, a>, то знищуються вказівник і об'єкт, але об'єкт, на який вказує вказівник, лишається. Що, власне, ви й продемонстрували своїм прикладом.

Подякували: incred1