LINUX.ORG.RU

[нуб][не проходил][gcc] обнуление указателя

 ,


0

3
int const n=10;
int array[n];
int *a=array;
delete a;
cout<<a;

------------- то что появляется в консоли - боюсь даже выкладывать.

======= Backtrace: =========
/lib/i686/cmov/libc.so.6(+0x6b281)[0xb7530281]
/lib/i686/cmov/libc.so.6(+0x6cad8)[0xb7531ad8]
/lib/i686/cmov/libc.so.6(cfree+0x6d)[0xb7534bbd]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb770b701]
./fastsort[0x8048967]
/lib/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb74dbc76]
./fastsort[0x8048581]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:06 427050     /home/max/C++/labs/fastsort
08049000-0804a000 rw-p 00000000 08:06 427050     /home/max/C++/labs/fastsort
09ec3000-09ee4000 rw-p 00000000 00:00 0          [heap]
b74c4000-b74c5000 rw-p 00000000 00:00 0 
b74c5000-b7605000 r-xp 00000000 08:03 431689     /lib/i686/cmov/libc-2.11.2.so
b7605000-b7607000 r--p 0013f000 08:03 431689     /lib/i686/cmov/libc-2.11.2.so
b7607000-b7608000 rw-p 00141000 08:03 431689     /lib/i686/cmov/libc-2.11.2.so
b7608000-b760b000 rw-p 00000000 00:00 0 
b760b000-b7628000 r-xp 00000000 08:03 415347     /lib/libgcc_s.so.1
b7628000-b7629000 rw-p 0001c000 08:03 415347     /lib/libgcc_s.so.1
b7629000-b762a000 rw-p 00000000 00:00 0 
b762a000-b764e000 r-xp 00000000 08:03 431673     /lib/i686/cmov/libm-2.11.2.so
b764e000-b764f000 r--p 00023000 08:03 431673     /lib/i686/cmov/libm-2.11.2.so
b764f000-b7650000 rw-p 00024000 08:03 431673     /lib/i686/cmov/libm-2.11.2.so
b7650000-b7739000 r-xp 00000000 08:03 303237     /usr/lib/libstdc++.so.6.0.13
b7739000-b773d000 r--p 000e9000 08:03 303237     /usr/lib/libstdc++.so.6.0.13
b773d000-b773e000 rw-p 000ed000 08:03 303237     /usr/lib/libstdc++.so.6.0.13
b773e000-b7745000 rw-p 00000000 00:00 0 
b7756000-b7758000 rw-p 00000000 00:00 0 
b7758000-b7759000 r-xp 00000000 00:00 0          [vdso]
b7759000-b7774000 r-xp 00000000 08:03 415369     /lib/ld-2.11.2.so
b7774000-b7775000 r--p 0001a000 08:03 415369     /lib/ld-2.11.2.so
b7775000-b7776000 rw-p 0001b000 08:03 415369     /lib/ld-2.11.2.so
bfcfb000-bfd10000 rw-p 00000000 00:00 0          [stack]
Aborted
 
Вопрос: ЧЯДНТ?


и заодно напомните плиз, присваивать указателю другой адресс желательно после обнуления, или все равно?

mrXorg
() автор топика

выучи основы С( да - даже не С++ ), без них будет трудно, в частности про то, что такое стек, например

aho
()
Ответ на: комментарий от mrXorg

Holy shit... Это надо записать. А можно поинтересоваться по каким книгам изучался C++?

и заодно напомните плиз, присваивать указателю другой адресс желательно после обнуления, или все равно?

Всё равно.

mkam ★
()

Массив array находится в стеке, размер фиксирован. Создавать и удалять память вручную можно только в куче.

note173 ★★★★★
()
Ответ на: комментарий от aho

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

mkam ★
()
Ответ на: комментарий от mkam

А можно поинтересоваться по каким книгам изучался C++?

изучилось только 5 первых глав Лафоре, дальше не иду, так-как нарешиваю еще кучу задач.

mrXorg
() автор топика
Ответ на: комментарий от mrXorg

Какую именно тему? Работа с динамической памятью? Обнуление указателей?
Прочитай http://ru.wikipedia.org/wiki/Delete_(C++) если срочно надо лабу сделать, а времени разбираться с динамической памятью нет.
Я вообще не особо понимаю, что ты ждал от этого куска кода.

mkam ★
()
Ответ на: комментарий от mrXorg

int a[100];
int *b = new [100];

a и b находятся в разных областях памяти, по-разному выделяются и освобождаются. a освобождается, когда метод завершается.

note173 ★★★★★
()
Ответ на: комментарий от mrXorg

Зачем ты освобождаешь память, а потом в неё лезешь?!! О_О

Ты же самых основных основ не усвоил, судя по приводимым фрагментам.

Несколько раз уже здесь посоветовали: читай K&R и Труп страуса - раздел про new/delete.

А ещё лучше - ложись спать, потому что вряд ли сейчас что-то полезное сделаешь. :)

OldFatMan ☆
()
Ответ на: комментарий от mrXorg

Ответ на вопрос ЧЯНТД:
delete []a;
и
cout << a;

Во-первых delete нельзя в твоём случе(об этом позже)
Во-вторых, если бы удалять было можно, то обращаться по адрессу уже нельзя.
В-третьих, после присвоения NULL указателю a указатель указывает на адресс 0. К нему тоже обращаться нельзя.

Нет точнее так, обращаться можно, но результат segmentation fault и т.п.

Далее о delete:
char a[10];
char *p = a; // присвоили указателю p адресс a;
delete p; // нельзя, т.к. это то же самое что delete[] a; - попытка освободить память, которая «тебе не пренадлежит».

но
char *a = new char[10];
char *p = a;
delete p; // можно

По простому: сделал new - сделай delete! сделал malloc - сделай free()...

invy ★★★★★
()
Ответ на: комментарий от mrXorg

ЧЯДНТ?

Пытаешься удалить массив, расположенный в статической памяти.

    
int const n = 10;
//int array[n];
int *a = new int[n];
delete []a;
a = 0;
std::cout << a;
mkam ★
()
Ответ на: комментарий от invy

> delete []a; и cout << a;

cout << a вроде не обращение по указателю. Не? Т.е. ошибка только в попытке освободить память под array.

mkam ★
()
Ответ на: комментарий от OldFatMan

Sorry, смотрел не очень внимательно предыдущие фрагменты кода и написал не про то:

Зачем ты освобождаешь память, а потом в неё лезешь?!!

Правильные ответы см. выше.

PS: Очевидно, мне тоже спать пора, а не комменты писать. ;)

OldFatMan ☆
()

Отличный примерчик того, как на C/С++ можно выстрелить в ногу и при этом пробить сквозную дыру в Земле!

mv ★★★★★
()
Ответ на: комментарий от mkam

cout << a по ссылке. Но какая разница, если содержимое памяти по нужном адрессу удалено операцией delete, т.е. если бы a было определено как char *a = new ...)...

invy ★★★★★
()
Ответ на: комментарий от invy

и да, правильнее говорить «удалено» , потому как delete не значит, что там затёрто нулями или ещё что, просто туда уже лезть нельзя.

invy ★★★★★
()
Ответ на: комментарий от invy

> Но какая разница, если содержимое памяти по нужном адрессу удалено операцией
Сдаётся мне, что ТС просто посмотрел на какой участок памяти указывает указатель. Не более.

mkam ★
()

ТС эталонный тролль. Удивительно, что все кинулись ему сразу «помогать». Хватило бы и одного ответного поста.

delete83 ★★
()
Ответ на: комментарий от invy

> Во-вторых, если бы удалять было можно, то обращаться по адрессу уже нельзя.

Советчики еще хуже ТСа. Не в состоянии отличить обращение к указателю от обращения по указателю.

ТС, не читай ЛОР, читай книжки.

geekless ★★
()
Ответ на: комментарий от geekless

Советчики рассматривают случай char *p а не int *p

invy ★★★★★
()

Прописываю тебе двойную дозу K&R. Именно K&R - начни с C, без него в C++ тебе очень туго придётся.

DELIRIUM ☆☆☆☆☆
()

всем спасибо

mrXorg
() автор топика
Ответ на: комментарий от geekless

Мда. Запишу ТС в особый список тех, к кому надо относиться снисходительно.

delete83 ★★
()

Удалять указатель ведущий на стек — этапять :)

Почитай про stack и heap.

tensai_cirno ★★★★★
()
Ответ на: комментарий от mrXorg

то, что не было создано в рантайме через new нельзя delete. аналогично нельзя free произвольный указатель. ошибок компиляции не будет ни там ни там, но при выполнении ногу отстрелишь

marvin_yorke ★★★
()
Ответ на: комментарий от geekless

>Советчики еще хуже ТСа. Не в состоянии отличить обращение к указателю от обращения по указателю.

Угу, читаю и офигеваю. В каждом втором посте умные поучения ТСа, хотя сами ахинею пишут.

Waterlaz ★★★★★
()
Ответ на: комментарий от invy

>cout << a по ссылке. Но какая разница, если содержимое памяти по нужном адрессу удалено операцией delete, т.е. если бы a было определено как char *a = new ...)...

По какой еще ссылке?

Waterlaz ★★★★★
()
Ответ на: комментарий от mv

Не ну а как ты хотел? Это ж С.

Можно даже так:

int *f(void)
{
    return (int *)0x12345678;
}
про тайный смысл этого кода никому не скажу.

mi_estas ★
()

Блин развели тему, я просто хотел сократить код программы. Еще давно начинал читать С++ за 21 день, но из-за очень быстрого темпа чтения без практики - ничего не запомнил. Вот и вспомнил на свой грех про удаления указателя... про new забыл... Решил спросить, думал быстро получу ответ и лягу спать, а они.... Читать по вашим советам, уж извините я не собираюсь, во-первых тут нужно идти ко всему постепенно и с практикой. А не питаться клочками информации. Спасибо invy, все понятно объяснил на ночь. Думаю тема исчерпала себя. Кто отпишется после моего коммента - тот ДОХЛЫЙ ТРОЛЛЬ :D

mrXorg
() автор топика

OMG! когда уже люди читать книги научатся...

s0L ★
()

Троллинг по всем полям

язабан

unixware
()

facepalm. Где же тут обнуление?

thrall
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.