Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2015, 22:33   #11
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Дык сказали ж уже 2 раза.
Пишите лучше просто a = 0 если nullptr не везде где надо есть.

и
Цитата:
А вообще лучше не управлять самому памятью без необходимости. Использовать STL контейнеры, smart-указатели и т.д.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 11.11.2015, 22:34   #12
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Ну я ж написал, в мейкефайле или другой системе сборки определяйте версию гцц и если больше 4.6, то влючайте новый стандарт и задайте дефайн, например, ТИПА_ЕСТЬ_НУЛЛПОИНТЕР и проверяйте это в коде.
p51x вне форума Ответить с цитированием
Старый 11.11.2015, 22:39   #13
chipside
Форумчанин
 
Регистрация: 03.08.2013
Сообщений: 208
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Ну я ж написал, в мейкефайле или другой системе сборки определяйте версию гцц и если больше 4.6, то влючайте новый стандарт и задайте дефайн, например, ТИПА_ЕСТЬ_НУЛЛПОИНТЕР и проверяйте это в коде.
Ну, да ладно. Я просто думал, что есть какая-то встроенная директива для проверки именно nullptr.

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Дык сказали ж уже 2 раза.
Пишите лучше просто a = 0 если nullptr не везде где надо есть.

и
Я просто не хочу глубоко использовать все возможности C++.
Для меня это слишком сложно.

Последний раз редактировалось Stilet; 21.11.2015 в 10:03.
chipside вне форума Ответить с цитированием
Старый 11.11.2015, 22:46   #14
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Для меня это слишком сложно.
Так управлять памятью самому не понимания даже до конца что такое указатели гораздо сложнее и опаснее.

Ну и вообще С++ никогда не был "легким". Для этого есть другие ЯП.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 11.11.2015 в 22:48.
Alex11223 вне форума Ответить с цитированием
Старый 11.11.2015, 23:03   #15
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от chipside Посмотреть сообщение
Ну, да ладно. Я просто думал, что есть какая-то встроенная директива для проверки именно nullptr.
И еще для сотни других фичей стандарта, да?
p51x вне форума Ответить с цитированием
Старый 12.11.2015, 06:35   #16
chipside
Форумчанин
 
Регистрация: 03.08.2013
Сообщений: 208
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
И еще для сотни других фичей стандарта, да?
А было бы очень удобно.
Хотя я не принуждаю разработчиков компиляторов следовать моим пожеланиям.
В некоторых источниках утверждалось, что использование delete более безопасно, чем malloc, realoc.
Я не могу их винить за такие утверждения, так как мне ничего не известно о том, что делают компиляторы borland c++builder или visual c++.
Но разве Гарвардский Национальный Университет не является достаточно серьёзной организацией?
nullptr был придуман не случайно. По моим наблюдением delete не всегда делает то, что от него ожидают.
---
https://msdn.microsoft.com/ru-ru/library/jj651642.aspx
На сайте Майкрософт утверждается, что использовать 0 или NULL не следует.
Мой личный опыт подтверждает эти слова.
В частности, можно попробовать поупражняться с условиями if (myValue) разных типов после присвоения 0, NULL и nullptr. Так что разница всё таки есть.
----
https://msdn.microsoft.com/ru-ru/library/4ex65770.aspx
Код:
// Delete the following line to resolve.
   f(nullptr);
Волшебный код найден.

Последний раз редактировалось chipside; 12.11.2015 в 07:07.
chipside вне форума Ответить с цитированием
Старый 12.11.2015, 07:33   #17
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
В некоторых источниках утверждалось, что использование delete более безопасно, чем malloc, realoc.
Нет, delete делает чуть больше, чем malloc, а realloc это о другом.

Цитата:
nullptr был придуман не случайно.
А в этой теме никто и не говорил о другом, но не для ого о чем вы думаете.

Цитата:
По моим наблюдением delete не всегда делает то, что от него ожидают.
Нет, он делает ровно то, что прописано стандартом. Если вы ожидаете, что он вам еще и кофе сварит, то это ваши проблемы.

Цитата:
На сайте Майкрософт утверждается, что использовать 0 или NULL не следует.
Для указателей и я вам скажу. Только причем здесь управление памятью или зануление массива?

Цитата:
В частности, можно попробовать поупражняться с условиями if (myValue) разных типов после присвоения 0, NULL и nullptr. Так что разница всё таки есть.
Или вызовами функций... похоже вы просто кусками инфы нахватались и не разобрались.

Цитата:
Волшебный код найден.
И что этот код показывает? Что нуллпоинтер может использоваться в качестве аргумента? Ну да. Кто-то утверждал обратное? Этот код поможет определить поддержку нуллпоинтера без ошибок компиляции - нет. Управляет памятью - нет. Очищает массив - нет.

Учтите, что все примеры там на C++CLI
p51x вне форума Ответить с цитированием
Старый 12.11.2015, 09:31   #18
chipside
Форумчанин
 
Регистрация: 03.08.2013
Сообщений: 208
По умолчанию

Конечно же Майкрософт отвечает только за качество своего собственного программного продукта, так и должно быть и никак иначе.
Спасибо за подсказку про x0, так как я нахватался информации о том, что nullptr появился в c++11, который по определению не может быть включён в gcc, встроенный в ASPLinux 14.0, то сделал неверный вывод о невозможности использования сего ключевого слова.
Код:
#include <iostream>

using namespace std;

int main ( void ) {
#ifdef nullptr
    cout << "nullptr" << endl;
    
    int * x;
    x = (int *) nullptr;
    if ( x ) {
    	cout << "x -- истина." << endl;
    } else {
    	cout << "x -- ложь." << endl;
    };
    
    x = new int[10];
    for (int i = 0; i <10; i++) x[i] = 2*i;
    delete [] x;
    for (int i = 0; i <10; i++) cout << x[i] << ' ';
    cout << endl;
    if ( x ) {
    	cout << "x -- истина." << endl;
    } else {
    	cout << "x -- ложь." << endl;
    };
    x = (int *) nullptr;
    for (int i = 0; i <10; i++) cout << x[i] << ' ';
    cout << endl;
#else
    cout << "can not use nullptr" << endl;
#endif

    return 0;
}
Кроссировал так:
Код:
g++ -c main.cpp -o main.o -std=c++0x -Dnullptr
g++ -o main main.o
./main
nullptr
x -- истина.
0 2 4 6 8 10 12 14 16 18 
x -- истина.
Ошибка сегментирования
delete [] ровным счётом ничего не сделал. О чём тут речь?
----
Я изменил код для чистоты эксперемента.
Код:
#include <iostream>

using namespace std;

int main ( void ) {
#ifdef nullptr
    cout << "nullptr" << endl;
    
    int * x;
    x = (int *) nullptr;
    if ( x ) {
    	cout << "x -- истина." << endl;
    } else {
    	cout << "x -- ложь." << endl;
    };
    
    x = new int[10];
    for (int i = 0; i <10; i++) x[i] = 2*i + 4;
    delete [] x;
    for (int i = 0; i <10; i++) cout << x[i] << ' ';
    cout << endl;
    if ( x ) {
    	cout << "x -- истина." << endl;
    } else {
    	cout << "x -- ложь." << endl;
    };
    x = (int *) nullptr;
    for (int i = 0; i <10; i++) cout << x[i] << ' ';
    cout << endl;
#else
    cout << "can not use nullptr" << endl;
#endif

    return 0;
}
Выхлоп консоли изменился.
Код:
g++ -c main.cpp -o main.o -std=c++0x -Dnullptr
g++ -o main main.o
./main
nullptr
x -- истина.
0 6 8 10 12 14 16 18 20 22 
x -- истина.
Ошибка сегментирования
Получается delete [] удалил первый элемент для типа int *. Что меня не устраивает.
chipside вне форума Ответить с цитированием
Старый 12.11.2015, 09:42   #19
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Код:
#if __cplusplus<201103L
   #define nullptr (0)
#endif
Croessmah вне форума Ответить с цитированием
Старый 12.11.2015, 09:47   #20
chipside
Форумчанин
 
Регистрация: 03.08.2013
Сообщений: 208
Радость

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Код:
#if __cplusplus<201103L
   #define nullptr (0)
#endif
Большое спасибо!
chipside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
26|error: 'nullptr' was not declared in this scope| taras-proger Общие вопросы C/C++ 2 08.09.2015 14:02
Определить по коду алгоритм сортировки и исправить специально допущенные в коде ошибки ( Turbo Delphi ) Just-Joni Помощь студентам 0 26.12.2013 12:24
Не получается найти ошибку в коде нужно определить размеры дисков C++ Borland kolyok333 Помощь студентам 4 15.01.2012 15:53
Cuda, openCL: как определить, есть ли поддержка xpu Visual C++ 1 27.08.2011 03:36
Поддержка казахского языка. Как? eremin Общие вопросы Delphi 1 01.12.2007 06:30