Как можно освободить выделенную память в конце области, в которой она возвращается функцией создания?

0

Я проиллюстрировал проблему с комментариями в приведенном ниже коде:

class MyClass //Some string-like class that encapsulates a dynamic char array.
{
public:
MyClass(unsigned int size)
{
data = new char[size];
}

char* GetCharArray() //In places where passing the raw array is needed, I call this method, but I want to create a separate char array and not touch the original one.
{
 char* temporary = new char[size + someNumber];
 for(int i = 0; i < size; i++)
 {
   temporary[i] = data[i];
 }
 DoSomeOperationForRemainingCharacters(temporary);
 return(temporary);
}
private:
char* data;
unsigned int size;
};

void SomeFunc(char* c);

int main()
{
 MyClass string(50):
 SomeFunc(string.GetCharArray()); //A new char array is allocated here, but it is
    // never deleted. If I return a templated pointer wrapper that wraps the array
    // and deletes it in the destructor, the wrapper dies at the end of
    // GetCharArray(), so by the time it passed to SomeFunc(), the char array is
    // already deleted. What else can I do?
}

Может быть, мне нужно создать небольшую систему сбора мини-мусора?

  • 1
    Есть ли хорошая причина для переизобретения std::vector (или std::string ), а не просто для его использования? Если это так, вы должны использовать RAII, чтобы заново его изобрести - это обычная «система мини-сбора мусора» в C ++.
Теги:
arrays
allocation

2 ответа

3
Лучший ответ

Почему вы возвращаете char *? вы можете вернуть std::string вместо этого, которая будет управлять собственной памятью.

Или при использовании массивов других типов std::vector будет управлять хранилищем для вас

Вы, где скрываете комментарий в своем коде, который может объяснить источник вашего замешательства - //A new char array is allocated here, but it is never deleted. If я return a templated pointer wrapper that wraps the array and deletes it in the destructor, the wrapper dies at the end of GetCharArray(), so by the time it passed to SomeFunc(), the char array is already deleted. What else can я do? //A new char array is allocated here, but it is never deleted. If я return a templated pointer wrapper that wraps the array and deletes it in the destructor, the wrapper dies at the end of GetCharArray(), so by the time it passed to SomeFunc(), the char array is already deleted. What else can я do?

Ваше выражение неверно. Временное умрет после оценки всего выражения. Предположим, что эти функции существуют:

void SomeFunc(const char* input); //old style C function that expects a raw char pointer

//creates a temporary string and returns it
std:string GetString() {
   std::string temp = "whatever";
      ... lots of manipulation ...
   return temp;
}

И вы оцениваете это выражение:

SomeFunc(GetString().c_str());

Стандарт C++ гарантирует, что временная строка, возвращаемая GetString(), будет освобождена только после вычисления всего выражения. с C++ 11 move-ctor временной массив символов внутри std::string не будет скопирован без необходимости

  • 0
    Когда я пытаюсь сделать что-то вроде GetString (). C_str () с моим пользовательским классом, временная строка умирает до того, как SomeFunc прочитает действительный массив символов. Как это сделано, чтобы не быть уничтоженным так рано на стандартном стенде? Если я сделаю это: std :: string temp = GetString (); SomeFunc (temp.c_str ()); тогда это работает. Может быть, мне нужно что-то сделать с конструктором перемещения>
  • 0
    Вы должны делать что-то еще не так. Могу поспорить, что вы не указали правильный copy-ctor, operator =, move-ctor. в вашем временном классе. Прочитайте о правиле 3 en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming) Также stackoverflow.com/questions/4782757/…
Показать ещё 5 комментариев
0

Используйте std::string для возврата char -based строки.

Он обрабатывает выделение памяти и освобождение для вас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню