2010-09-06 4 views
4
void aFunction_2() 
{ 
    char* c = new char[10]; 
    c = "abcefgh"; 
} 

Вопросы:Это создает утечку памяти?

  1. Будет: c = "abdefgh" храниться в new char[10]?

  2. Если c = "abcdefgh" - это еще одна область памяти, я должен удалить ее?

  3. Если бы я хотел сохранить информацию в char[10], я бы использовал функцию, такую ​​как strcpy, чтобы поместить информацию в char[10]?

+2

@GMan: Ну, это действительно C++. Но C-ish C++. Таким образом, плохой C++. Я с Заном. Используйте 'std :: string'. – sbi

+0

@sbi: Все хорошо. :) Я согласен: отдельное управление ресурсами из использования ресурсов. – GManNickG

ответ

8

Да, это утечка памяти.

Да, вы должны использовать strcpy, чтобы поместить строку в выделенный массив символов.

Так как это код на C++, вы бы никого не сделали. Вы должны использовать std :: string.

6
void aFunction_2() 
{ 
    char* c = new char[10]; //OK 
    c = "abcefgh";   //Error, use strcpy or preferably use std::string 
} 

1- Будет ли: с = "abdefgh" быть выделено внутренняя новый символ [10]?

Нет, вы меняете указатель, указав ранее на ячейку памяти 10 байт, чтобы указать на новую константу, вызывающую утечку памяти в десять байт.

2- Если c = "abcdefgh" - это еще одна область памяти , я должен удалить ее?

нет, она не была выделена на куче, его в памяти только для чтения

3- Если бы я хотел Сохранить информацию о внутренней полукокса [10] Я хотел бы использовать функцию как strcpy, чтобы разместить информацию внутри char [10]?

Не уверен, что вы подразумеваете под «внутренним» здесь. когда вы выделяете, используя новую память, выделяется в кучу, и в обычных условиях можно получить доступ из любой части вашей программы, если вы указали указатель на блок памяти.

0
  1. Нет (указатель переназначение)
  2. Нет
  3. Да, вы можете использовать strcpy() см for instance:
+0

В первом случае указатель изменяется и больше не указывает на выделенную память. поэтому «Нет». – cpx

+0

@Dave: Спасибо, обновлено. –

0

Ваш ответ уже был дан ответ несколько раз, но я думаю, что все ответы отсутствуют один важный бит (который вы не запрашивали в явном виде): Пока вы выделили память на десять символов, а затем перезаписали единственный указатель, который вы ссылаетесь на эту область памяти, вы создали утечку памяти, которую вы не можете исправить anymor е. Чтобы сделать это правильно, вы бы использовали std :: strcpy() память из предварительно выделенной предварительно инициализированной постоянной части памяти, где содержимое вашего литерала строки хранилось в ваших динамически распределенных 10 символах.

И тут приходит важную часть:

Когда вы закончите с решением этих 10 символов, вы DEALLOCATE их с помощью delete[]. Здесь важны []. Все, что вы выделяете с помощью new x[], должно быть освобождено delete[]. Ни компилятор, ни среда выполнения не предупреждают вас, когда используют обычный delete, поэтому важно запомнить это правило.

0
  1. Нет, это только переназначение указателя;
  2. Нет, delete Что-то, что не исходило от new, часто падает; и
  3. Да, strcpy выполнит эту работу ... но обычно не используется в C++.

Поскольку никто не ответил с кодом, std::uninitialized_copy_n (или просто std::copy_n, это на самом деле не делает разницы здесь) более C++, чем strcpy:

#include <memory> 

static char const abcs[] = "abcdefgh"; // define string (static in local scope) 
char *c = new char[10]; // allocate 
std::copy_n(abcs, sizeof abcs, c); // initialize (no need for strlen) 

// when you're done with c: 
delete[] c; // don't forget [] 

Конечно, std::string является то, что вы должны Вместо этого:

#include <string> 
std::string c("abcdefgh"); // does allocate and copy for you 
// no need for delete when finished, that is automatic too! 
Смежные вопросы