Я кодирую это на C++. Моя текущая проблема заключается в том, что мне нужно обрезать пробелы с начала массива символов. Мне не разрешено использовать любые строковые функции. Моя идея состоит в том, чтобы подсчитать количество пробелов в начале, выделить память на основе того, сколько меньше памяти мне понадобится в массиве символов, если бы у меня не было этих пробелов, сделайте это, а затем скопируйте новую строку и освободите оригинальная строка.Как освободить память при обрезке массива символов?
Моя проблема в том, что я не могу освободить эту строку, если Visual Studio не ударил точку останова для меня. Я могу заставить его работать с кодом, который у меня есть ниже (не освобождая вообще от рогальной строки) d =, но не может ли это вызвать утечку памяти?
Спасибо за вашу помощь заранее.
#include <iostream>
using namespace std;
class SmartString{
private:
char* str;
public:
SmartString ()
{
str = NULL;
}
SmartString (char *str){
int length = 0;
int copy_index = 0;
while(str[length] != '\0')
{
length++;
}
length++;
char * copy;
copy = (char*)malloc(sizeof(char) * length);
copy = new char[length];
while(copy_index < length)
{
copy[copy_index] = str[copy_index];
cout << str[copy_index];
copy_index++;
}
this -> str = copy;
}
~ SmartString()
{
if(str != NULL)
{
delete str;
free(str);
}
}
void ShowString()
{
cout << "[" << str << "]";
}
int Size()
{
if(str == NULL)
return 0;
else
{
int i = 0;
while(str[i] != '\0')
{
i++;
}
i++;
return i;
}
}
**void Trim()
{
int counter = 0;
while (str[counter] == ' ' && counter < Size())
{
counter++;
}
int new_length = Size() - (counter + 1);
char * temp;
temp = (char*) malloc(sizeof(char) * new_length);
temp = new char[new_length];
int counter_2 = 0;
while(counter_2 < Size())
{
temp[counter_2] = str[counter_2 + counter];
counter_2++;
}
str = temp;
}**
};
int main()
{
char *str;
str = " Hello";
SmartString * s = new SmartString(str);
str = "Change";
(*s).Trim();
(*s).ShowString();
system("Pause");
}
Не используйте 'malloc' в C++ (кроме того, что вы делаете * оба * и память утечки и ** затем ** двойное удаление). Кроме того, должно быть 'delete [] str;' поскольку вы 'new []'. – crashmstr
Почему существует 'новый', непосредственно следуя за' malloc', с результатами обоих присваивается 'copy'? – Michael
@crashmstr: Да, но, к сожалению, 'realloc()' работает только с 'malloc()'. Поэтому 'malloc()' представляется мне совершенно разумным, особенно если вам нужно «обрезать массив», как говорит OP, которого он хочет. –