2016-11-05 7 views
-1

Мне задана задача, где мне нужно создать функцию string_copy. Обратите внимание, что тело функции и прототипы были предоставлены источником и должны быть сохранены. Части, написанные мной, после комментария write your code here.Удаление динамически распределенной памяти

#include <iostream> 
using namespace std; 
int string_length(const char* string_c); 
char* string_copy(const char* string_c); 

int main() 
{ 
    const char* string_c = "This is a string and is a long one so that we can create memory leaks when it is copied and not deleted"; 

    // write your code here 
    int length = string_length(string_c); 
    cout << "Copied String: " << string_copy(string_c) << endl; 
    return 0; 
} 

int string_length(const char* string) { 
    int length = 0; 
    for (const char* ptr = string; *ptr != '\0'; ++ptr) { 
     ++length; 
    } 
    return length; 
} 

char* string_copy(const char* string) { 
    // we need to add 1 because of ’\0’ 
    char* result = new char[string_length(string) + 1]; 

    // write your code here (remember zero-termination !) 
    int i; 
    for (i = 0; string[i] != '\0'; ++i) 
    { 
     result[i] = string[i]; 
    } 
    result[i] = '\0'; 
    return result; 
} 

Теперь задача говорит мне

, что очень важно, чтобы любая память, выделенная с е = новым типом выпущен позже с удалением е (и = новым типом [размером] с удалением [ ] a) иначе это приведет к ошибке.

Непонятно, существует ли ошибка compile/runtime error или ошибка, как в моей задаче не соответствовала требованию ошибки.

Мой вопрос: в этом коде как удалить промежуточный динамически созданный массив result? Если я удалю result, не будет ли это результатом задачи? Тогда как я должен соблюдать приведенную выше цитату или, может быть, имитировать утечку памяти, как указано в строковой константе long?

Спасибо.

EDIT: Почему отрицательные голоса? Пожалуйста, объясните хотя бы причину! Я не прошу какого-либо решения или чего-то еще, но простое предложение, если я пропущу какой-то момент или нет!

+0

В отрицательных голосах нет ненависти. Они просто отмечают, что этот вопрос не подходит для будущих пользователей сайта. Только посмотрев на ваш вопрос: есть похожие вопросы. Если вы просто прочитали вопросы и ответы по связанным вопросам, вы можете получить свой собственный ответ. К сожалению, не все готовы потратить время на конструктивную критику. –

+0

@CraigYoung Я думаю, что техническая часть вопроса может иметь схожие вопросы уже, но в моем случае я хотел понять ожидаемое задание (в вопросе) от меня (поскольку, как я полагал, возможно, я не знаю намерения задачи, поскольку я не очень хорошо разбирающийся в языке), а не точно техническое решение.Я думаю, что я достаточно разбираюсь в Q & A и читал его более одного раза, я бы сказал, что отрицательные голоса соответствуют общему элитарному мышлению, обсуждаемому здесь: http://meta.stackexchange.com/questions/9953/could-we-please -be-a-bit-nicer-to-new-users –

+0

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

ответ

2

Вызывающий абонент string_copy будет нести ответственность за освобождение памяти, когда это будет сделано, позвонив по телефону delete[].

Это, кстати, ужасный способ написать код на C++. Вы должны использовать std::string или std::vector<char> или что-то в этом роде.

Вот почему:

int length = string_length(string_c); 
char* copy = string_copy(string_c); 
cout << "Copied String: " << copy << endl; 
delete[] copy; 
return 0; 

Тьфу.

+0

Правда! Это задача, и я не могу контролировать, как она мне представлена. Теперь я знаю, что именно имел в виду. Переход от 'C#' настолько прост :( –

+1

@ Jeet.Deir Нет. Я бы сказал, что переход из C#, но вынужден использовать *** старые методы стиля C++ в стиле *** делает это неуместным. –

1

Фактически идеальным решением является использование std::string, а не char *. В вашем примере нет необходимости в using char * вместо std::string. С std::string:

  • Вам не нужно ничего нового
  • Вам не нужно ничего удалять
  • Вы можете сделать все с станд :: строка, что вы делаете с гольца *.
+0

Правда! это задача, представленная мне, и я действительно не могу контролировать, как мне ее выполнить! –

Смежные вопросы