5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
|
||||||
1 | ||||||
Можно ли несколько раз делитить область памяти?19.11.2011, 18:53. Показов 2860. Ответов 42
Метки нет (Все метки)
Собственно, чреват ли ошибками код:
0
|
19.11.2011, 18:53 | |
Ответы с готовыми решениями:
42
Копирование строки в область памяти несколько раз Сделать так, чтобы можно было добавить несколько одинаковых блюд, не кликая несколько раз Можно ли в С++ выделить память под объект в заданную мной область памяти? Можно ли создать нераспределенную область памяти если диск С занял все место? |
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
|
|
19.11.2011, 19:45 [ТС] | 21 |
Собственно, попробовал запустить этот код, компилятор (Qt'шный) не стал ругаться, программа отработала корректно.
Так где собака то зарыта?
0
|
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
|
|
19.11.2011, 19:53 [ТС] | 23 |
Ну Берс в самом начале написал, что такой код чреват ошибками.
Вот и интересуюсь, какими=)
1
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
19.11.2011, 19:54 | 24 |
Есть гарантия, что NULL - это невалидный спецадрес, обозначающий, что указатель ни куда не указывает. И усматривают здесь изготовители не компиляторов, всё зависит от начального адреса памяти. На IBM совместимых это должен быть ноль, не зависимо от компиляторов и даже от языков, а сигнальные камни любят память с ноля начинать, а если так сделано, то NULL не имеет права быть нолём, опять таки даже в том случае, если кроскомпилятор прошивок таких коммутаторов выпустит мелкософт.
0
|
Заблокирован
|
|
19.11.2011, 19:57 | 25 |
Первый раз delete освобождает память. С этого момента, этот кусок памяти становится "свободным". И система в любой миг может отдать его ещё кому нибудь. Второй раз delete пытается освободить уже чужую память. И если эта память принадлежит уже кому то там - может произойти порча данных (хотя скорее всего система этот косяк пофиксит, и заломает накосячевший процесс) Добавлено через 55 секунд taras atavin, да я уже вразумел) NULL всегда не_валидный адрес, но не всегда является нулём)
2
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
19.11.2011, 19:58 | 26 |
Не ноль, а невалидный номер байта. На IBM совместимых гарантировано невалидный номер байта - это ноль, но если сдеать c, или c++ кроскомпилятор для сиганального камня, то там может быть и другое значение NULL.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
19.11.2011, 20:01 | 28 |
0
|
Jupiter
|
19.11.2011, 20:25
#29
|
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||||||
19.11.2011, 20:40 | 30 | ||||||||||
Наоборот. Если NULL!=0, то по
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||||||
19.11.2011, 21:04 | 32 | ||||||||||
На значение NULL без обращения упоминания имени данного макроса, так как проверять просто на ноль нельзя: если ноль - валидный адрес, то это может привести к невозможности выделить память.
Добавлено через 13 минут . Нет. Ни каких чужих данных там быть не может: в многозадачных осях все программы работают в виртуальных адресных пространствах, а освобожденная память из них изымается, то есть виртуальный адрес после освобождения становится столь же невалидным, как и NULL, кусок же памяти по тому же физическому адресу, который как раз может быть выдан кому то ещё, после такого выделения окажется в другом виртуальном адресном пространстве, так как они все локальны, глобальны только физические адреса, а в однозадачной системе просто больше никого нет, кому могла бы быть выдана память по тому же адресу. Опасно же второй раз удалять не подряд, если та же самая прога и тот же её екземпляр успеет получить кусок памяти, на который попадёт тот же адрес.
Добавлено через 4 минуты То есть
0
|
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
|
|
19.11.2011, 21:08 [ТС] | 33 |
Правильно ли я понимаю, что один раз выделив память, а затем ее освободив, физически к этой области памяти процесс уже доступа получить никогда не сможет?
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||||||
19.11.2011, 21:17 | 34 | ||||||||||
Нет. Имплементейшн дефайн - это как раз и есть не всегда ноль. А nullptr приняли, чтоб избавиться от макроса в неконтролируеммом заголовке. У меня где то был исходник для убунты, начинающийся с
Добавлено через 4 минуты Я тоже эту очепятку не понимаю. Должно быть
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
19.11.2011, 21:26 | 36 | |||||
Почему "никогда"? К этой памяти можно обратиться, если:
1. Освобождённый адрес находится на странице, содержащей другой, валидный локальный адрес. В этом случае освобожденный адрес тоже должен стать невалидным, но система не в состоянии этого гарантировать. Но память на одной странице не может быть выдана разным процессам, так что чужую память ты таким образом не освободишь и к ней не обратишься. 2. Если память была повторно выделена процессу. Добавлено через 2 минуты
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||||||||||||
19.11.2011, 21:47 | 38 | |||||||||||||||
Первый и должен, так как аргумент - число. Но и NULL - тоже число, то есть foo(NULL) вызовет первый вариант, а программист имеет ввиду второй. Если аргумент - переменная указательного типа, то вызовется второй вариант, как и должно быть. Целей может быть много, но в данном случае на самом деле всё таки одна - избавиться от макроса. Почему надо от него избавиться - это уже другой вопрос и проблема со многими аспектами. Возможность ошибочного дефайна - один из них. Второй - вызов перегруженной функции с невалидным указателем, если есть версия c интом. Чтоб не писать
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
19.11.2011, 21:51 | 40 |
Кстати, студия 2008 не знает ни nullptr, ни NULL_PTR, ни null_ptr, ни NULLPTR.
0
|
19.11.2011, 21:51 | |
19.11.2011, 21:51 | |
Помогаю со студенческими работами здесь
40
Можно ли использовать несколько раз setlocale? Если да, то как? Можно ли восстановить несколько раз отредактированный документ microsoft word? Можно ли, проделав эту операцию несколько раз, получить число более 10 000? Как можно уменьшить код если его куски повторяются по несколько раз? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |