Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
PakistanCode
4 / 4 / 1
Регистрация: 05.02.2013
Сообщений: 193
#1

delete[] - C++

18.07.2013, 16:37. Просмотров 1252. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2013, 16:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос delete[] (C++):

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

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

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

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

delete this - C++
Какие последствия могут быть при выполнении команды delete this; из какой-нибудь функции члена?

New delete - C++
написал код ну там в блоке перегрузки оператора добавил new void operator=(char* t) { int tl=strlen(t); a=new char; ...

28
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
18.07.2013, 16:38 #2
C++
1
void deleteStr()
А что Вы пытаетесь удалить? Функция не принимает никаких аргументов.
1
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 16:39 #3
PakistanCode, а нельзя поподробнее изложить проблему? Например привести исходный код и код ошибки?
1
PakistanCode
4 / 4 / 1
Регистрация: 05.02.2013
Сообщений: 193
18.07.2013, 16:40  [ТС] #4
Мимино, у меня в классе есть переменная char* string. под которую я выделил память в конструкторе. И теперь мне просто нужна функция которая будеть очищать память

Добавлено через 10 секунд
Ilot, код под спойлером_
0
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 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
PakistanCode
4 / 4 / 1
Регистрация: 05.02.2013
Сообщений: 193
18.07.2013, 16:42  [ТС] #6
Мимино, спасибо
Только проблема в том, что мне постоянно нужно будет удалять и выделять память. Есть ли вариант организовать это в виде функции?
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 16:44 #7
PakistanCode, я же написал, в предыдущей теме, как память выделять под строку. Повторяете ту же ошибку.
1
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,206
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
PakistanCode
4 / 4 / 1
Регистрация: 05.02.2013
Сообщений: 193
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[]  
PakistanCode
4 / 4 / 1
Регистрация: 05.02.2013
Сообщений: 193
18.07.2013, 16:46  [ТС] #10
ValeryS, я просто хочу чтобы у меня заработало Не обращайте внимание на смысловую нагрузку сего конструктора. Как эта штука заработает - я удалю, главное чтобы заработала
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 16:47 #11
Цитата Сообщение от PakistanCode Посмотреть сообщение
Кстати такой вариант тоже не работает:
Читайте 7 пост.
1
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 16:47 #12
PakistanCode, выход за пределы массива вот тут:
C++
1
string[lenght_] = '\0';
измени на:
C++
1
string[lenght_-1] = '\0';
и будет все хорошо работать.
1
CheshireCat
Эксперт С++
2895 / 1244 / 78
Регистрация: 27.05.2008
Сообщений: 3,397
18.07.2013, 16:49 #13
Ну разумеется, не работает. Ты сколько памяти выделяешь?
lenght_ байт? А надо - lenght_ + 1. Про нуль-терминатор не забывай.
1
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 16:49 #14
Ещё раз: выделение памяти char*
1
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
18.07.2013, 16:49 #15
Цитата Сообщение от PakistanCode Посмотреть сообщение
Кстати такой вариант тоже не работает:
Вопрос стоял не в работает/не работает
Цитата Сообщение от PakistanCode Посмотреть сообщение
Только проблема в том, что мне постоянно нужно будет удалять и выделять память. Есть ли вариант организовать это в виде функции?
Для начала почитайте о деструкторах. Оператор delete можно перегрузить для объекта Вашего класса и вызывать при необходимости. Ну или явно вызывать деструктор(кстати. а так ведь можно да? )
1
18.07.2013, 16:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2013, 16:49
Привет! Вот еще темы с ответами:

new[] - delete[] - C++
Всем привет. Глупый вопрос, но тем не менее, он меня крайне заинтересовал. Вот например, есть такой код: void main() { int...

new delete - C++
здраствуйте! назрел вопрос class cls1 { ... ... } class cls2 { ... cls1 *pt = new cls1();

new - delete - C++
Добрый день. Выделяю память для записи 10 значений координат точки. #include &lt;iostream&gt; using namespace std; class point { ...

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


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

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

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