powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пожалуйста, подскажите новичку!
24 сообщений из 24, страница 1 из 1
Пожалуйста, подскажите новичку!
    #33437801
OisO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A* a = new A(); A* b(a); A* c(a); delete b; что будет с "c" и "a" ??
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33437812
OisO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Словами наверное так:
если несколько указателей ссылаются на одну и ту же область памяти, что будет если для одного из них сделать delete
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33437931
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удалиться то что было там записано, а оставшийся указатель будет указывать в никуда. Деструктор производного должен вызвать деструктор базового, а тот проверить на соответствие указателя: располагаются ли по нему то, что должно.
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33437937
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может просто упасть сославшись на то, что освобождаемая память не может быть освобождена, т.к. ее держит другая переменная
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33437952
Teem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A - нет такого встроенного типа данных.
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33437975
OisO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A - нет такого встроенного типа данных. <--- не совсем понятно
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33437982
OisO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Деструктор производного должен вызвать деструктор базового, а тот проверить на соответствие указателя: располагаются ли по нему то, что должно. <--- вы имеете в виду, что при delete a; вызывается деструктор a->~A() ?
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33438001
OisO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
производный и базовый это разве не о наследовании, а я имею в виду 2 указателя на одну область памяти...
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33438035
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зависит от реализации конструктора А. Он может
либо клонировать экземпляры, либо создавать
ссылочные обьекты (интерфейсы).
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33438037
Teem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А - это пользовательский тип данных . Пусть это будет класс А значит у класса должен быть конструктур и деструктор, которые нужно описывать.
Потом у тебя идет вызов функций где создаются локальные переменные, которые автоматически уничтожаются при выходе из функции, какое значение должна возвращать функция тоже нужно описать. delete b - это не правильно, так как ты еще не создал объект. А вот переменная а в функции передается как формальный параметр и при выходе она может быть уничтожена, а может быть и нет. Опять же как ты эту функцию опишешь.Вообщем или вместо А выбери встроенный тип или опиши класс А. (или структуру А, или массив А, то есть создай пользовательский тип данных).
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33438125
OisO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
delete b - это не правильно, так как ты еще не создал объект.
Почему не создал? A* b(a); <--- вызывается конструктор копии по умолчанию. Для "a" была выделена память в куче(динамически). После A* b(a); "b" - это то же что и "a" фактически, потому для него вызовется delete b;
Само "A" - не принципиально - вместо него может быть int:
int* a = new int(10); int* b(a); delete b; // int* b(a) эквивалентно int* b = a;
(с)
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33438158
OisO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл сказать что язык - C++ :-)
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33438187
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OisOЗабыл сказать что язык - C++ :-)ну тут 2 варианта: либо С, либо С++, исходя из названия форума.

С не подходит, т.к. нету оператора new.

остается С++
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33438229
Teem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OisOdelete b - это не правильно, так как ты еще не создал объект.
Почему не создал? A* b(a); <--- вызывается конструктор копии по умолчанию. Для "a" была выделена память в куче(динамически). После A* b(a); "b" - это то же что и "a" фактически, потому для него вызовется delete b;
Само "A" - не принципиально - вместо него может быть int:
int* a = new int(10); int* b(a); delete b; // int* b(a) эквивалентно int* b = a;
(с)

Если конструктор по умолчанию вызывается то и деструктор должен вызваться. Просто в это пследовательности кода delete b - не уместно.
скорее нужно сделать так
b (a){
//// что то делает
....
delete [] a;
return 0;
}
А потом нужно смотреть как b(a) используется. может быть ничего и не нужно больше.
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33438233
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При удалении массиива нельзя юзать delete, нужон delete[]
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33438310
OisO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
int main(int argc, char ** argv)
{
int* a = new int( 10 ); // Тут создается не массив а указатель на число 10 
// для массива было бы int* a = new int[10];

int* b(a); // Вызов "конструктора копирования по умолчанию" - этот конструктор 
// предоставляется "системой" уго можно не описывать так же как пустой конструктор по умолчанию
// это то же самое что написать int* b = a; Тоесть это не вызов функции "b"
// которая принимает в качестве параметра "a" с последующим возвращением 
// int*, а инициализация указателя "b" указателем "a"

delete b;

return  0 ;
}
1-е сообщение cerebrum кажется ответило на вопрос, единственно что я не понял о каких деструкторах в нем идет речь...
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33438551
Teem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OisOНу вот пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
int main(int argc, char ** argv)
{
int* a = new int( 10 ); // Тут создается не массив а указатель на число 10 
// для массива было бы int* a = new int[10];

int* b(a); // Вызов "конструктора копирования по умолчанию" - этот конструктор 
// предоставляется "системой" уго можно не описывать так же как пустой конструктор по умолчанию
// это то же самое что написать int* b = a; Тоесть это не вызов функции "b"
// которая принимает в качестве параметра "a" с последующим возвращением 
// int*, а инициализация указателя "b" указателем "a"

delete b;

return  0 ;
}
Все равно это код не работает.
1-е сообщение cerebrum кажется ответило на вопрос, единственно что я не понял о каких деструкторах в нем идет речь...
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33438607
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
единственно что я не понял о каких деструкторах в нем идет речь...
Я посчитал а и b - классами, вот и замудрил..
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33438761
OisO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Teem:
Все равно это код не работает.

Какие-то ошибки выдает? Не компилится? Какой компилятор?
Спрашиваю, потому что у меня это работает и не ругается - что и явилось причиной вопроса на форуме...
Вообщето в этом коде нет ошибок. Попробуй (если под виндовс) убери argc argv из int main(...) и тип int перед main попробуй замени на void. И убери комментарии - может компилятор их ошибочно понял изза русских символов...
Я компилирую в g++ под FreeBSD 6.0

to Cerebrum:
Я посчитал а и b - классами, вот и замудрил..

Ну вообщето разницы нет - в последнем примере a и b - указатели на тип int, но поскольку класс - это пользовательский тип, то int можно заменить на любой другой класс в том числе и описаный пользователем и ничего не поменяется...

Код: plaintext
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 <iostream>
using namespace std;

int main()
{
        int* a = new int( 10 );
        int* b(a);

        cout <<"Pointer b: " << b << endl;
        cout <<"Pointed object: " << *b << endl;
        cout <<"Pointer a: " << a << endl;
        cout <<"Pointed object: "<< *a << endl;

        cout << endl; 

        delete a;

        cout << "After delete a; " << endl;
        cout <<"Pointer b: " << b << endl;
        cout <<"Pointer a: " << a << endl;
        cout <<"Pointed object *b: " << *b << endl;
        cout <<"Pointed object *a: " << *a << endl;

        *a =  25 ;

        cout << "*a = 25;" << endl;
        cout << "a: " << a << " " <<"*a: "<<  *a << endl;
        cout << "b: " << b << " " <<"*b: "<<  *b << endl;



        return  0 ;
}
В общем вопрос возник изза вышеприведенного примера - можно заметить что после вызова delete ни значение указываемого объекта ни значение указателя не изменяются... Похоже на то, что delete не делает ничего кроме уведомления менеджера памяти о том что, память выделенную с помощью new уже снова можно использовать... Попытка обратится к "удаленным" данным проходит успешно до тех пор пока вдруг кто-то не решит записать в "освобожденную" область и тогда наверное по указателю я получу вместо ожидаемого 25 какой-то случайный мусор. Единственно что я не знаю как это можно проверить - потому хотелось уточнить теоретически :)
Заранее спасибо!
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33438800
OisO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Результат работы программы:


Pointer b: 0x804b030
Pointed object: 10
Pointer a: 0x804b030
Pointed object: 10

After delete a;

Pointer b: 0x804b030 <-- delete был вызван но ничего не поменялось
Pointer a: 0x804b030 <--
Pointed object *b: 10 <--
Pointed object *a: 10 <--

*a = 25;

a: 0x804b030 *a: 25
b: 0x804b030 *b: 25
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33438814
Teem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я в консольном режиме работал С VS6. Оператор delete вообще как пятое колесо.Но с интами все понятно - это встроенные типы данных.
int* b = a так компилятор пропускает , int* b(a) а так ругается на а.
Проверил отладчиком - вроде память везде очищается. Но консоль тут не показатель. Все таки нужно если под Винду кодировать, то вариант уборки мусора нужно посмтреть.
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33439407
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OisOДеструктор производного должен вызвать деструктор базового, а тот проверить на соответствие указателя: располагаются ли по нему то, что должно. <--- вы имеете в виду, что при delete a; вызывается деструктор a->~A() ?

Деструктор производного класса обычно НЕ ВЫЗЫВАЕТ деструктор базового.
Это делается автоматически и в нужном порядке.

Никаких соответствий указателей проверять нигде не надо -- чему они должны соответствовать ? Просто не осуществлять доступ к этому объекту ни через один из указателей на него -- и все. Лучше в этом случае указатели занулять, но это не обязательно.
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33439681
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv OisOДеструктор производного должен вызвать деструктор базового, а тот проверить на соответствие указателя: располагаются ли по нему то, что должно. <--- вы имеете в виду, что при delete a; вызывается деструктор a->~A() ?

Деструктор производного класса обычно НЕ ВЫЗЫВАЕТ деструктор базового.
Это делается автоматически и в нужном порядке.

Никаких соответствий указателей проверять нигде не надо -- чему они должны соответствовать ? Просто не осуществлять доступ к этому объекту ни через один из указателей на него -- и все. Лучше в этом случае указатели занулять, но это не обязательно.
1. См. мое выше, про классы
2. У тебя 2 указателя на одну и ту же область памяти, например, занимаемую объектом производным от CObject. По одному из указателей ты решил его завалить, вызвав delete. Второй указатель получается смотрит в никуда, так? И теперь если ты заново попытаешься завалить удаленный объект через второй указатель получается, что программа воспримет это как должное и освободит для системы n-байт несуществующего объекта? Я говорю это не голословно, я сам писал менеджер памяти в одной из своих прог (не консольных). И прога успешно падала или переходила в режим отладки с сообщением, что не может освободить память по указателю. Вот здесь и нужна проверка на существование этого объекта, по крайней мере в данной ситуации.
...
Рейтинг: 0 / 0
Пожалуйста, подскажите новичку!
    #33441903
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebrumВот здесь и нужна проверка на существование этого объекта, по крайней мере в данной ситуации.

Это ты мне написал?

И как предлагаешь осуществлять "проверку на существование этого объекта" ?
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Пожалуйста, подскажите новичку!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]