LINUX.ORG.RU

[C++] delete[] не работает

 


0

0

как и у любого уважающего себя студента у меня есть вот это:

class MyString {    char *ps; unsigned int L; unsigned int Tl; .. 

и всё бы хорошо, но при перераспределении памяти у меня начинаются проблемы:

void MyString::MemReconf(unsigned int NewSize) 
{ 
   if(NewSize)
     { char newStrAlloc[NewSize]; 
       if (NewSize<Tl) Tl=NewSize; 
       for (int i=0;i<=Tl;i++)newStrAlloc[i]=ps[i]; 
       newStrAlloc[Tl]=0;
       L=NewSize; delete[] ps;
       ps=newStrAlloc; } 
} 

если delete [] убрать, то всё работает. чего не так? где-то у Страуструпа было написано, ЕМНИП, что delete[] работает только для NULL и массивов полученных new. так вот, так оно и есть. в конструкторе у меня new.

//за быдлокод бейте не сильно, и, желательно, конструктивно

★★★★★

Последнее исправление: RedPossum (всего исправлений: 1)

неужели пустых строчек так жалко?

mono ★★★★★
()

> for (int i=0;i<=Tl;i++)

for (int i=0;i<Tl;i++)

newStrAlloc[Tl]=0;

newStrAlloc[Tl - 1] = '\0';

ksv
()

AFAIK, для любого delete нужен как минимум new. У тебя в тексте я его в упор не вижу.

anonymous
()
Ответ на: комментарий от anonymous

я же внизу написал. ок, вот конструктор :

MyString::MyString(char *Bs)
{
    Tl=std::strlen(Bs);
    L=3*Tl;
    ps=new char[L];
    for (int i=0 ; i <= Tl; i++) ps[i]=Bs[i];
}

RedPossum ★★★★★
() автор топика

> char newStrAlloc[NewSize];

Здесь еще нельзя использовать массивы - только указатели.

char *newStrAlloc = new char[NewSize];

Иначе удалять память нельзя будет.

ksv
()
Ответ на: комментарий от RedPossum

Вызовите два раза MemReconf и словите кучу неожиданных проблем. Если не ошибаюсь, удалять массивы нельзя. Только выделенную с помощью new память.

ksv
()
Ответ на: комментарий от RedPossum

> а она вообще не удалялась, даже с первого раза.

А нечего за пределы массива писать.

ksv
()
Ответ на: комментарий от k_andy

>> for (int i=0;i<=Tl;i++)newStrAlloc[i]=ps[i];

memcpy(newStrAlloc, ps, Tl+1);

std::copy

const86 ★★★★★
()

и всё бы хорошо, но при перераспределении памяти у меня начинаются проблемы:

Проблемы у тебя начались, видимо, с рождения. Ты же упоротый.

Нахрена char*, когда есть std::string? Что ты этим пытаешься сэкономить?

Нахрена руками выделять память? Чтобы было побольше бессонных ночей ковыряния в отладчике? Будет у тебя исключение где-то между new и delete - получишь утечку. Про умные указатели никогда не слышал?

Что вот это за поебень?

for (int i=0;i<=Tl;i++)newStrAlloc[i]=ps[i];
Любитель мыть полы зубной щёткой? Скопировать всё сразу религия не позволяет?

Отрубать руки по локоть таким быдлокодерам.

NightmareZ
()
Ответ на: комментарий от NightmareZ

>Что вот это за поебень?

Прогрев кеша процессора, очевидно же.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.