Форум программистов, компьютерный форум CyberForum.ru

Присвоить NULL массиву - C++

Восстановить пароль Регистрация
 
antake
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 29
16.10.2013, 09:25     Присвоить NULL массиву #1
Здравствуйте!
Есть код:
C++
1
2
matrix();
clear();
В классе matrix объявлен указатель
C++
1
 unsigned char* data;
.
В конструкторе matrix() есть строка data = NULL;

Когда захожу в функцию clear, data уже не равен нулю! Дебаггер показывает, что он указывает на значение 0'', имеет ненулевой адрес!

Подскажите, пожалуйста, в чем дело?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
16.10.2013, 10:01     Присвоить NULL массиву #2
может быть Вы ему значение присваиваете между вызовами Matrix() и Clear()
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
16.10.2013, 10:49     Присвоить NULL массиву #3
Цитата Сообщение от antake Посмотреть сообщение
имеет ненулевой адрес
Нууу тут не все так просто. Если в си без плюсов можно было присваивать указатель на void любому указателю, то в плюсах нельзя. Плюсовой компилятор сам подставит на свой вкус значение этому макросу. В лучшем случае ноль.
NULL

С вики: NULL - прям первый абзац.

А решение:
C++
1
nullptr
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
16.10.2013, 11:09     Присвоить NULL массиву #4
А каким образом связан конструктор matrix и функция clear ? Мне отчего-то кажется, что здесь простое непонимание происходящего....
antake, ты не мог бы привести минимальный пример кода, воспроизводящего проблему?
antake
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 29
16.10.2013, 11:18  [ТС]     Присвоить NULL массиву #5
Да, конечно:

C++
1
2
3
4
5
6
7
        // Default constructor
        template<typename T> matrix<T>::matrix ()
        {
            data = NULL;
            rows = 0;
            columns = 0;
        }
C++
1
2
3
4
5
6
        template<typename T> matrix<T>::matrix (const shared_ptr<Mat> X)
        {   
            matrix<T>();
            setMatrix( X );
 
        }
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename T> void matrix<T>::setMatrix( const shared_ptr<Mat> mat )
        {
            clear();
                      .........
                 }
        template<typename T> void matrix<T>::clear()
        {
                delete[] data;
                data = NULL; // it doesn't work..., see function setMatrix
                rows = 0;
                columns = 0;
        }
Добавлено через 2 минуты
Спасибо за ответы, я подозреваю, что действительно проблема в макросе NULL ( который у меня объявлен как 0), но пока другим занят, не проверил.

data становится ненулевой уже после выхода из дефолтного конструктора
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
16.10.2013, 11:21     Присвоить NULL массиву #6
Цитата Сообщение от antake Посмотреть сообщение
data становится ненулевой
Суть не в том, чтобы сделать ее именно непременно нулевой, а только в том, чтобы она больше не указывала ни на один объект.

А с nullptr что дебаггер говорит?
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
16.10.2013, 11:54     Присвоить NULL массиву #7
А не очень даже важно, что он говорит. Дело не в NULL и не в nullptr.

Дело вот в этом коде:
C++
1
2
3
4
5
6
        template<typename T> matrix<T>::matrix (const shared_ptr<Mat> X)
        {   
            matrix<T>();
            setMatrix( X );
 
        }
antake, ты думаешь, после выполнения строки matrix<T>(); у тебя будет data == NULL ? Нет. Потому что matrix<T>(); - это создание безымянного объекта типа matrix<T> ! И этот безымянный объект не имеет никакого отношения к тому объекту, для которого потом будет вызван setMatrix.... Разумеется, поэтому и data содержит мусор.

Тебе нужен немного другой синтаксис, доступный в C++11 (но не в более раннем C++03!):
C++
1
2
3
4
5
6
        template<typename T> matrix<T>::matrix (const shared_ptr<Mat> X):
            matrix<T>()
        {   
            setMatrix( X );
 
        }
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
16.10.2013, 11:56     Присвоить NULL массиву #8
NULL, конечно, может и не быть нулем, но вероятность этого (на форуме С++ для начинающих) ничтожна.
Меня другое забавляет. Вот в этом некоем подобии копирующего конструктора
C++
1
2
3
4
5
template<typename T> matrix<T>::matrix (const shared_ptr<Mat> X)
{   
    matrix<T>();
    setMatrix( X );
}
создается временный объект maxtrix<T>(). А поле data собственно создаваемого объекта никто не обнуляет. Так с чего бы ему быть NULL'ом?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.10.2013, 12:02     Присвоить NULL массиву #9
Цитата Сообщение от antake Посмотреть сообщение
data становится ненулевой уже после выхода из дефолтного конструктора
правильно ли я понял:
C++
1
2
matrix<int> m;
cout << m.data << endl; // выведет отличное от 0 значение?
Добавлено через 3 минуты
P.S. похоже ТС запутался с конструкторами.
Цитата Сообщение от CheshireCat Посмотреть сообщение
Тебе нужен немного другой синтаксис, доступный в C++11 (но не в более раннем C++03!):
Придется обойтись функцией инициализации тогда.
antake
0 / 0 / 0
Регистрация: 24.09.2012
Сообщений: 29
16.10.2013, 12:04  [ТС]     Присвоить NULL массиву #10
ААА, спасибо!)

даже стыдно немного стало)
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
16.10.2013, 12:10     Присвоить NULL массиву #11
Он может вывести все, что угодно. Разыменование NULL-указателя - это UB по Стандарту.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2013, 12:29     Присвоить NULL массиву
Еще ссылки по теме:

C++ Можно ли значения двумерного динамического массива присвоить обыкновенному двумерному массиву?
C++ Как присвоить двумерному символьному массиву значение?
C++ Как правильно присвоить значение NULL

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
16.10.2013, 12:29     Присвоить NULL массиву #12
Цитата Сообщение от CheshireCat Посмотреть сообщение
Он может вывести все, что угодно. Разыменование NULL-указателя - это UB по Стандарту.
Если это ответ на моё сообщение, то разыменования не происходит, мы просто выводим адрес.
Yandex
Объявления
16.10.2013, 12:29     Присвоить NULL массиву
Ответ Создать тему
Опции темы

Текущее время: 02:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru