Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
5 / 5 / 5
Регистрация: 05.02.2013
Сообщений: 197

delete[]

18.07.2013, 16:37. Показов 3446. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
подскажите пожалуйста как заставить это работать?
Вылетает на строчке delete[].
Выделяю ведь память с помощью оператора new.
А в идеале нужно сделать так чтобы была отдельная ф-я типа:

C++
1
2
3
4
void deleteStr()
{
delete[] string;
}
подскажите пожалуйста и я наконец-то разберусь с этой темой)
Вот исходный код:
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
# include <iostream>
using namespace std;
 
class mString
{
private:
    char* string;
public:
    mString(char* string_)
    {
        int lenght_ = strlen(string_);
        string = new char[lenght_];
        string[lenght_] = '\0';
 
        for (int i = 0; i < lenght_; i++)
            string[i] = string_[i];
 
        delete [] string;
    }
};
 
int main(void)
{
    mString("12.34");
    system("pause");
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.07.2013, 16:37
Ответы с готовыми решениями:

Используя delete по указателю, возвращенному new [] или delete [] указателем, возвращаемым new
Помогите ответить на вопрос, не могу понять суть вопроса (правильно ли понимаю, что будет если выделить память в куче и затем не удалить...

Какая разница между delete и delete[]
Нашел информацию на разных сайтах и всё равно остались вопросы. Я понимаю, что delete используется для удаления одиночных объектов и...

В чем разница между delete и delete[]?
а можете еще по подробней рассказать про delete, точнее даже delete, чем именно отличается delete от delete, т.к. я попробовал...

28
 Аватар для Мимино
191 / 161 / 35
Регистрация: 22.05.2013
Сообщений: 455
Записей в блоге: 1
18.07.2013, 16:38
C++
1
void deleteStr()
А что Вы пытаетесь удалить? Функция не принимает никаких аргументов.
1
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
18.07.2013, 16:39
PakistanCode, а нельзя поподробнее изложить проблему? Например привести исходный код и код ошибки?
1
5 / 5 / 5
Регистрация: 05.02.2013
Сообщений: 197
18.07.2013, 16:40  [ТС]
Мимино, у меня в классе есть переменная char* string. под которую я выделил память в конструкторе. И теперь мне просто нужна функция которая будеть очищать память

Добавлено через 10 секунд
Ilot, код под спойлером_
0
 Аватар для Мимино
191 / 161 / 35
Регистрация: 22.05.2013
Сообщений: 455
Записей в блоге: 1
18.07.2013, 16:41
То, что Вы хотите сделать отдельной функцией, называется деструктор. Обычно записывается как конструктор класса с префиксом ~.
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
# include <iostream>
using namespace std;
 
class mString
{
private:
    char* string;
public:
    mString(char* string_)
    {
        int lenght_ = strlen(string_);
        string = new char[lenght_];
        string[lenght_] = '\0';
 
        for (int i = 0; i < lenght_; i++)
            string[i] = string_[i];
     }
     ~mString() { delete [] string; }
};
 
int main(void)
{
    mString("12.34");
    system("pause");
}
1
5 / 5 / 5
Регистрация: 05.02.2013
Сообщений: 197
18.07.2013, 16:42  [ТС]
Мимино, спасибо
Только проблема в том, что мне постоянно нужно будет удалять и выделять память. Есть ли вариант организовать это в виде функции?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 16:44
PakistanCode, я же написал, в предыдущей теме, как память выделять под строку. Повторяете ту же ошибку.
1
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
18.07.2013, 16:44
Цитата Сообщение от PakistanCode Посмотреть сообщение
Мимино, у меня в классе есть переменная char* string. под которую я выделил память в конструкторе.
и тут же удалил
Цитата Сообщение от PakistanCode Посмотреть сообщение
mString(char* string_)
{
int lenght_ = strlen(string_);
string = new char[lenght_];
string[lenght_] = '\0';
for (int i = 0; i < lenght_; i++)
string[i] = string_[i];
delete [] string;
}
вопрос: зачем выделял?
1
5 / 5 / 5
Регистрация: 05.02.2013
Сообщений: 197
18.07.2013, 16:45  [ТС]
Кстати такой вариант тоже не работает:
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
# include <iostream>
using namespace std;
 
class mString
{
private:
    char* string;
public:
    mString(char* string_)
    {
        int lenght_ = strlen(string_);
        string = new char[lenght_];
        string[lenght_] = '\0';
 
        for (int i = 0; i < lenght_; i++)
            string[i] = string_[i];
    }
 
    ~mString()
    {
        delete [] string;
    }
};
 
int main(void)
{
    mString("12.34");
    system("pause");
}
Когда вызывается деструктор вылазит ошибка
Миниатюры
delete[]  
0
5 / 5 / 5
Регистрация: 05.02.2013
Сообщений: 197
18.07.2013, 16:46  [ТС]
ValeryS, я просто хочу чтобы у меня заработало Не обращайте внимание на смысловую нагрузку сего конструктора. Как эта штука заработает - я удалю, главное чтобы заработала
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 16:47
Цитата Сообщение от PakistanCode Посмотреть сообщение
Кстати такой вариант тоже не работает:
Читайте 7 пост.
1
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
18.07.2013, 16:47
PakistanCode, выход за пределы массива вот тут:
C++
1
string[lenght_] = '\0';
измени на:
C++
1
string[lenght_-1] = '\0';
и будет все хорошо работать.
1
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
18.07.2013, 16:49
Ну разумеется, не работает. Ты сколько памяти выделяешь?
lenght_ байт? А надо - lenght_ + 1. Про нуль-терминатор не забывай.
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 16:49
Ещё раз: выделение памяти char*
1
 Аватар для Мимино
191 / 161 / 35
Регистрация: 22.05.2013
Сообщений: 455
Записей в блоге: 1
18.07.2013, 16:49
Цитата Сообщение от PakistanCode Посмотреть сообщение
Кстати такой вариант тоже не работает:
Вопрос стоял не в работает/не работает
Цитата Сообщение от PakistanCode Посмотреть сообщение
Только проблема в том, что мне постоянно нужно будет удалять и выделять память. Есть ли вариант организовать это в виде функции?
Для начала почитайте о деструкторах. Оператор delete можно перегрузить для объекта Вашего класса и вызывать при необходимости. Ну или явно вызывать деструктор(кстати. а так ведь можно да? )
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
18.07.2013, 16:49
PakistanCode, предположим, что начальная строка состоит из 3ех символов и 1го символа конца строки. strlen() вернет 3. Вы выделили под string 3 char'а, но при этом сделали string[3] = '\0'. Выделите string = new char[length+1].

p.s length - не lenght

p.p.s А что это вообще делает?
Цитата Сообщение от PakistanCode Посмотреть сообщение
mString("12.34");
Просто создаете временный объект и никуда не присваиваете?
1
5 / 5 / 5
Регистрация: 05.02.2013
Сообщений: 197
18.07.2013, 16:51  [ТС]
Ilot, ваш вариант не вылетает, но вот в чём проблемма:
1 - вариан как было
2 - ваш

А функция strlen мне ещё пригодиться много раз, да и не красиво как-то
Миниатюры
delete[]   delete[]  
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
18.07.2013, 16:52
PakistanCode, я тебе ответил по этому поводу. См. выше.
1
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
18.07.2013, 16:53
PakistanCode, ну так тебе правильно сказали делай так:
C++
1
2
        string = new char[lenght_ + 1];
        string[lenght_] = '\0';

Не по теме:

и не забудь всем спасибкм поставить:umnik:

1
5 / 5 / 5
Регистрация: 05.02.2013
Сообщений: 197
18.07.2013, 16:55  [ТС]
Всем спасибо!
Вот рабочий вариант

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
31
32
33
34
35
36
37
# include <iostream>
using namespace std;
 
class mString
{
private:
    char* string;
public:
    mString(char* string_)
    {
        int lenght_ = strlen(string_);
        string = new char[lenght_ + 1];
        string[lenght_] = '\0';
 
        for (int i = 0; i < lenght_; i++)
            string[i] = string_[i];
 
    }
 
    void clearString()
    {
        delete [] string;
        string = 0;
    }
 
    ~mString()
    {
        if (string) delete [] string;
    }
};
 
int main(void)
{
    mString m("12.34");
    m.clearString();
    system("pause");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.07.2013, 16:55
Помогаю со студенческими работами здесь

Чем отличается delete[] от delete?
чем отличается? delete mas от delete mas

Delete или delete []
Здравствуйте. Написал программу которая создает динамический массив, заполняемый нулями и выводит адреса всех элементов на разных этапах...

delete[] *pointer vs. delete pointer и утечка памяти
Здравствуйте! Есть класс &quot;умного&quot; указателя counted_ptr, который удаляет хранящийся в нём T* owned; только если кол-во владельцев...

"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"?
Я правильно понимаю, что &quot;delete a, b;&quot; эквивалентно &quot;delete a; delete b;&quot; ?

new и delete
как лучше очищать память? #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; //как лучще очищать память? int main(){ char *buff...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru