Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
23 / 2 / 0
Регистрация: 24.04.2011
Сообщений: 66

Null pointer assignment.

24.08.2011, 00:20. Показов 5158. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Такая проблема: Пытаюсь вызвать функция класса Up()
s2 = s1.up(), возвращая указатель на строку (по-умолчанию в s2 пустая строка имеет адрес NULL).
Вот только почему передается не ссылка, а само значение строки, поскольку компилятор пишет: null pointer assignment. Значит ссылка не поменялась, и он, не выделив память, прострочил прямо с нулевого адреса...
И второй вопрос, как можно в данном случае все-таки передать значение (хотя первый вопрос в силе), но так, чтобы выделить точное кол-во памяти под передаваемую строку в s2?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "iostream.h"
#include "CONIO.h"
#include "Ctype.h"
#include "string.h"
using namespace std;
class String
{
 private:
  char* st;
 public:
  String(): st(NULL) {}
  String(char* str) {int len = strlen(str);
             st = new char[len+1]; strcpy(st, str);
            }
  ~String() {delete st;}
  void show()const {cout<<endl<<st;}
  String up() {int len = strlen(st);
           for(int i=0; i<len; i++) st[i] = toupper(st[i]); return st;
          }
};
///////////////////
int main()
{
 String s1 = "Test yes TEsT";
 String s2;
 s2 = s1.up();
 s2.show();
 getch();
return 0;
}
Заранее благодарен!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.08.2011, 00:20
Ответы с готовыми решениями:

Null pointer assignment
Помогите найти ошибку, при заполнении массива вручную в конце выдает - Null pointer assignment. И еще вопрос, как сделать чтобы после...

Ошибка Null pointer assignment
Помогите, пожалуйста, кто знает. BC++ 3.11 выдает 'Null pointer assignment'. Я, в принципе, в курсе, что это из-за того, что я...

Error null pointer assignment
Помогите, программа, которая создает вектор элементы которого равны сумме положительных элементов столбца массива, в конце выводит null...

25
23 / 2 / 0
Регистрация: 24.04.2011
Сообщений: 66
25.08.2011, 02:08  [ТС]
Студворк — интернет-сервис помощи студентам
Благодарю за глубокие объяснения. Изучил механизмы конструктора копирования и перегрузки присваивания. Остались 2 вопроса:

1). Я правильно понял, конструктор копирования запускается в момент инициализации только что созданного объекта, а перегруженная операция присваивания во всех остальных случаях присваивания?
2). В строках:
C++
1
2
3
4
5
String operator= (const String& s1) {int len = strlen(s1.st);
                                       st = new char[len+1];
                                       strcpy(st, s1.st);
                                       return String(st);
                                      }
Для чего вообще возвращать куда-то (не пойму, куда) значение, если я итак уже сделал все, что нужно в строке:
C++
1
 strcpy(st, s1.st);
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
25.08.2011, 02:22
Цитата Сообщение от Stalin45 Посмотреть сообщение
Благодарю за глубокие объяснения. Изучил механизмы конструктора копирования и перегрузки присваивания. Остались 2 вопроса:

1). Я правильно понял, конструктор копирования запускается в момент инициализации только что созданного объекта, а перегруженная операция присваивания во всех остальных случаях присваивания?
Да.

Цитата Сообщение от Stalin45 Посмотреть сообщение
Для чего вообще возвращать куда-то (не пойму, куда) значение, если я итак уже сделал все, что нужно в строке:
C++
1
 strcpy(st, s1.st);
Опреатор= возвращает значение, чтобы можно было использовать его в цепочке присваиваний (или как часть выражения):
C++
1
a = b = c;
Причём для обычных типов можно (хотя и бессмысленно) записать так:
C++
1
(a = b) = c;
Для того, чтобы эта возможность сохранилась и для перегруженного оператора, он должен возвращать ссылку на объект, а не просто значение.
1
Заблокирован
25.08.2011, 19:28
Цитата Сообщение от Stalin45 Посмотреть сообщение
Благодарю за глубокие объяснения. Изучил механизмы конструктора копирования и перегрузки присваивания. Остались 2 вопроса:

1). Я правильно понял, конструктор копирования запускается в момент инициализации только что созданного объекта, а перегруженная операция присваивания во всех остальных случаях присваивания?
2). В строках:
C++
1
2
3
4
5
String operator= (const String& s1) {int len = strlen(s1.st);
                                       st = new char[len+1];
                                       strcpy(st, s1.st);
                                       return String(st);
                                      }
Для чего вообще возвращать куда-то (не пойму, куда) значение, если я итак уже сделал все, что нужно в строке:
C++
1
 strcpy(st, s1.st);
У вас неправильно написан оператор присваивания. Вы заабыли удалить память, на которую указывает указатель st того объекта, которому вы присваиваете новое значение.

Что касается конструктора копирования, то он также используется, когда вы передаете объекты в качестве аргументов функций, и при возвращении из функций объектов вашего класса.

 Комментарий модератора 
Убедительная просьба - заканчивайте постоянный оверквотинг. Нет никакого смысла каждый раз цитировать сообщение целиком, лучше сделать несколько цитат, но цитировать существенные места, которые вы комментируете.
1
23 / 2 / 0
Регистрация: 24.04.2011
Сообщений: 66
25.08.2011, 23:13  [ТС]
Цитата Сообщение от Сыроежка Посмотреть сообщение
Вы заабыли удалить память, на которую указывает указатель st того объекта, которому вы присваиваете новое значение.
Простите, но я не понял, вы не могли бы подробнее?
Вот как я это вижу:
Оператор в качестве аргумента получает ссылку....следовательно вы точно говорите не про объект-аргумент (его удалять не надо). Я выделяю память под st объекта-получателя. Возвращает оператор временный объект, из которого при необходимости копируются данные, после чего он удаляется...так что нужно удалять вручную???
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
25.08.2011, 23:23
Stalin45, поскольку оператор присваивания работает с уже созданным объектом-получателем, то возможно получатель уже содержит в себе некоторую строку, на которую указывает его st. Когда выделяется память под новое содержимое, указатель на эту память записывается в st, а та область памяти, на которую раньше указывал st оказывается потерянной. Поэтому перед выделением памяти старую надо освободить. А чтобы случайно при этом не удалить источник, надо бы проверить, не присваиваем ли мы самого себе.
Кстати, в некоторых случаях может оказаться приемлемым не выделять лишний раз память. Для этого можно хранить размер выделенного буфера, и если он не меньше размера копируемой строки, то просто копировать поверх старого содержимого, без удаления/выделения. Но в некоторых случаях такое поведение не желательно.
1
23 / 2 / 0
Регистрация: 24.04.2011
Сообщений: 66
26.08.2011, 00:22  [ТС]
Спасибо! Тогда, чтобы подытожить, вот финальная версия оператора присваивания.
C++
1
2
3
4
5
6
7
8
String& operator= (const String& s1) { if (this == &s1) return *this;
                 
                                       delete [] st;
                                       int len = strlen(s1.st);
                                       st = new char[len+1];
                                       strcpy(st, s1.st);
                                       return *this;
                                     }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.08.2011, 00:22

Null pointer
void C_StringBit :: setStrBit() { char* ptr1; cout &lt;&lt; &quot;Введите строку&quot;&lt;&lt; endl; cin &gt;&gt; ptr1; lengthBit = strlen(ptr1); ...

Invalid null pointer
Так она работает: #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;list&gt; #include &lt;string&gt; using namespace std; void...

string, invalid null pointer
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; #define SIZE 450 ...

Ошибка компиляции: invalid null pointer
Не могу понять, в чем проблема.. Кто знает? #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;list.h&quot; using namespace...

Что делать, если "просят" разыменовать null-pointer?
Есть код примерно следующего содержания: class Foo { private: int *ptr; public: int&amp; operator*() { ...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru