我有一个任务,我需要创建string_copy函数注意函数体和原型是由源给出的,需要维护。我写的部分是在评论{throw null;}
之后。
write your code here
现在任务告诉我
使用e = new TYPE分配的任何内存都非常重要 稍后发布删除e(和a =新TYPE [size] with delete [] a) 否则这将导致错误。
我的任务中的错误意味着#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;
}
或错误是否不符合要求错误并不完全清楚。
我的问题是,在此代码中如何删除中间动态创建的compile/runtime error
数组?如果我删除了result
,那么它不会达到任务目的吗?那么我如何尊重上面的引用或者模拟result
字符串常量中给出的内存泄漏?
感谢。
编辑:为什么负面投票?请至少解释原因!我不是在问任何解决方案或其他什么,但仅仅是建议我是否遗漏了某些观点!
答案 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;
呸。
答案 1 :(得分:1)
事实上,理想的解决方案是使用std::string
而非char *
。在您的示例中,实际上不需要using char *
而不是std::string
。
使用std::string
: