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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.