Вызывает ли strcpy строка в больший массив символов утечку памяти? - PullRequest
3 голосов
/ 02 ноября 2010

Привет всем, просто интересно, может ли следующее вызвать утечку памяти?

char* a = "abcd"
char* b = new char[80];

strcpy(b, a);

delete[] b;

Удалит ли он весь блок из 80 или только 4 символа, скопированных в него strcpy?Спасибо!

Ответы [ 5 ]

11 голосов
/ 02 ноября 2010

Вы выделили 80 байтов в b, поэтому delete[] освободит 80 байтов.То, что вы сделали с массивом в это время, не имеет значения.

(Если, конечно, вы не повредили кучу, в этом случае delete[] может произойти сбой).: Как уже отмечали другие, поскольку b является массивом, вам нужно использовать delete[] b; вместо delete b;.Некоторые реализации могут позволить вам сойти с рук, но другие - нет, и это все равно будет неправильно.

5 голосов
/ 02 ноября 2010

Утечка памяти - это когда вы не освобождаете память.То, что вы выделили больше, чем нужно, не означает утечку памяти.То, что вы делаете со своей памятью, зависит от вас.

Хотя это должно быть 1) delete [] b;, или вы получите неопределенное поведение, и 2) Будьте std::string или std::vector, так что вы неи управлять ресурсом, и использовать его.

4 голосов
/ 02 ноября 2010

Система распределения позаботится о том, чтобы запоминать, как долго выполняются распределения. Содержание не имеет значения вообще.

Однако вам нужно вызвать оператор удаления права . В этом случае, так как вы выделили новый [], вам нужно удалить [].

Последняя строка должна быть:

delete[] b;

Если вы выделяете один элемент, используйте delete, если вы выделяете массив, используйте delete [].

1 голос
/ 02 ноября 2010

Поскольку это тег C ++, вот версия C ++ - хорошо разбираться в управлении памятью через new/delete, но лучше избегать делать это вручную, используя RAII.

#include <string>
#include <iostream>
using namespace std;

int main()
{
    string a("abcd");
    string aCopy(a);
    cout << aCopy << endl;

    const char* b(aCopy.c_str());
    cout << b << endl;
}
0 голосов
/ 03 ноября 2010

Код, который вы опубликовали, сломан.Пожалуйста, проверьте эту ветку: Что такое форма массива 'delete'?

gl

...