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

delete[] - C++

Восстановить пароль Регистрация
 
 
PakistanCode
2 / 2 / 0
Регистрация: 05.02.2013
Сообщений: 175
18.07.2013, 16:37     delete[] #1
подскажите пожалуйста как заставить это работать?
Вылетает на строчке 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");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2013, 16:37     delete[]
Посмотрите здесь:

"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"? C++
C++ delete[]
new - delete C++
C++ new и delete
C++ delete this
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
18.07.2013, 16:38     delete[] #2
C++
1
void deleteStr()
А что Вы пытаетесь удалить? Функция не принимает никаких аргументов.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 16:39     delete[] #3
PakistanCode, а нельзя поподробнее изложить проблему? Например привести исходный код и код ошибки?
PakistanCode
2 / 2 / 0
Регистрация: 05.02.2013
Сообщений: 175
18.07.2013, 16:40  [ТС]     delete[] #4
Мимино, у меня в классе есть переменная char* string. под которую я выделил память в конструкторе. И теперь мне просто нужна функция которая будеть очищать память

Добавлено через 10 секунд
Ilot, код под спойлером_
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
18.07.2013, 16:41     delete[] #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");
}
PakistanCode
2 / 2 / 0
Регистрация: 05.02.2013
Сообщений: 175
18.07.2013, 16:42  [ТС]     delete[] #6
Мимино, спасибо
Только проблема в том, что мне постоянно нужно будет удалять и выделять память. Есть ли вариант организовать это в виде функции?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 16:44     delete[] #7
PakistanCode, я же написал, в предыдущей теме, как память выделять под строку. Повторяете ту же ошибку.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
18.07.2013, 16:44     delete[] #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;
}
вопрос: зачем выделял?
PakistanCode
2 / 2 / 0
Регистрация: 05.02.2013
Сообщений: 175
18.07.2013, 16:45  [ТС]     delete[] #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");
}
Когда вызывается деструктор вылазит ошибка
Миниатюры
delete[]  
PakistanCode
2 / 2 / 0
Регистрация: 05.02.2013
Сообщений: 175
18.07.2013, 16:46  [ТС]     delete[] #10
ValeryS, я просто хочу чтобы у меня заработало Не обращайте внимание на смысловую нагрузку сего конструктора. Как эта штука заработает - я удалю, главное чтобы заработала
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 16:47     delete[] #11
Цитата Сообщение от PakistanCode Посмотреть сообщение
Кстати такой вариант тоже не работает:
Читайте 7 пост.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
18.07.2013, 16:47     delete[] #12
PakistanCode, выход за пределы массива вот тут:
C++
1
string[lenght_] = '\0';
измени на:
C++
1
string[lenght_-1] = '\0';
и будет все хорошо работать.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
18.07.2013, 16:49     delete[] #13
Ну разумеется, не работает. Ты сколько памяти выделяешь?
lenght_ байт? А надо - lenght_ + 1. Про нуль-терминатор не забывай.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2013, 16:49     delete[] #14
Ещё раз: выделение памяти char*
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
18.07.2013, 16:49     delete[] #15
Цитата Сообщение от PakistanCode Посмотреть сообщение
Кстати такой вариант тоже не работает:
Вопрос стоял не в работает/не работает
Цитата Сообщение от PakistanCode Посмотреть сообщение
Только проблема в том, что мне постоянно нужно будет удалять и выделять память. Есть ли вариант организовать это в виде функции?
Для начала почитайте о деструкторах. Оператор delete можно перегрузить для объекта Вашего класса и вызывать при необходимости. Ну или явно вызывать деструктор(кстати. а так ведь можно да? )
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
18.07.2013, 16:49     delete[] #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");
Просто создаете временный объект и никуда не присваиваете?
PakistanCode
2 / 2 / 0
Регистрация: 05.02.2013
Сообщений: 175
18.07.2013, 16:51  [ТС]     delete[] #17
Ilot, ваш вариант не вылетает, но вот в чём проблемма:
1 - вариан как было
2 - ваш

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

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2013, 16:55     delete[]
Еще ссылки по теме:

delete[] *pointer vs. delete pointer и утечка памяти C++
New/Delete C++
New delete C++

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

Или воспользуйтесь поиском по форуму:
PakistanCode
2 / 2 / 0
Регистрация: 05.02.2013
Сообщений: 175
18.07.2013, 16:55  [ТС]     delete[] #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");
}
Yandex
Объявления
18.07.2013, 16:55     delete[]
Ответ Создать тему
Опции темы

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