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

delete[]

18.07.2013, 16:37. Просмотров 2337. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2013, 16:37
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 10 секунд
Ilot, код под спойлером_
0
189 / 159 / 35
Регистрация: 22.05.2013
Сообщений: 455
Записей в блоге: 1
18.07.2013, 16:41 5
То, что Вы хотите сделать отдельной функцией, называется деструктор. Обычно записывается как конструктор класса с префиксом ~.
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  [ТС] 6
Мимино, спасибо
Только проблема в том, что мне постоянно нужно будет удалять и выделять память. Есть ли вариант организовать это в виде функции?
0
5474 / 4869 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 16:44 7
PakistanCode, я же написал, в предыдущей теме, как память выделять под строку. Повторяете ту же ошибку.
1
Модератор
Эксперт по электронике
8277 / 6136 / 822
Регистрация: 14.02.2011
Сообщений: 21,341
18.07.2013, 16:44 8
Цитата Сообщение от 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  [ТС] 9
Кстати такой вариант тоже не работает:
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");
}
Когда вызывается деструктор вылазит ошибка
0
Миниатюры
delete[]  
5 / 5 / 5
Регистрация: 05.02.2013
Сообщений: 197
18.07.2013, 16:46  [ТС] 10
ValeryS, я просто хочу чтобы у меня заработало Не обращайте внимание на смысловую нагрузку сего конструктора. Как эта штука заработает - я удалю, главное чтобы заработала
0
5474 / 4869 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 16:47 11
Цитата Сообщение от PakistanCode Посмотреть сообщение
Кстати такой вариант тоже не работает:
Читайте 7 пост.
1
Эксперт С++
1884 / 1232 / 354
Регистрация: 16.05.2013
Сообщений: 3,231
Записей в блоге: 6
18.07.2013, 16:47 12
PakistanCode, выход за пределы массива вот тут:
C++
1
string[lenght_] = '\0';
измени на:
C++
1
string[lenght_-1] = '\0';
и будет все хорошо работать.
1
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
18.07.2013, 16:49 13
Ну разумеется, не работает. Ты сколько памяти выделяешь?
lenght_ байт? А надо - lenght_ + 1. Про нуль-терминатор не забывай.
1
5474 / 4869 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 16:49 14
Ещё раз: выделение памяти char*
1
189 / 159 / 35
Регистрация: 22.05.2013
Сообщений: 455
Записей в блоге: 1
18.07.2013, 16:49 15
Цитата Сообщение от PakistanCode Посмотреть сообщение
Кстати такой вариант тоже не работает:
Вопрос стоял не в работает/не работает
Цитата Сообщение от PakistanCode Посмотреть сообщение
Только проблема в том, что мне постоянно нужно будет удалять и выделять память. Есть ли вариант организовать это в виде функции?
Для начала почитайте о деструкторах. Оператор delete можно перегрузить для объекта Вашего класса и вызывать при необходимости. Ну или явно вызывать деструктор(кстати. а так ведь можно да? )
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
18.07.2013, 16:49 16
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  [ТС] 17
Ilot, ваш вариант не вылетает, но вот в чём проблемма:
1 - вариан как было
2 - ваш

А функция strlen мне ещё пригодиться много раз, да и не красиво как-то
0
Миниатюры
delete[]   delete[]  
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
18.07.2013, 16:52 18
PakistanCode, я тебе ответил по этому поводу. См. выше.
1
Эксперт С++
1884 / 1232 / 354
Регистрация: 16.05.2013
Сообщений: 3,231
Записей в блоге: 6
18.07.2013, 16:53 19
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  [ТС] 20
Всем спасибо!
Вот рабочий вариант

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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.07.2013, 16:55

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

"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; //как лучще очищать...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.