编辑:Pastebin链接到底部的全部代码
对于我的CS215课程,我得到了一个名为String215的类,它是一个基本的字符串类,用于帮助理解动态内存分配和使用char数组的指针算法。
这个课是以非常基本的骨架形式给我的,原型但没有实现,还有一个测试函数来测试我的实现。我不能在此作业中使用任何C String函数。
令人不安的程序部分是append函数,它只是将参数string215对象附加到当前string215对象的末尾。
// Add a suffix to the end of this string. Allocates and frees memory.
void string215::append(const string215 &suffix)
{
char *output = new char[str_len(data)+suffix.length()+1];
for(int x = 0; x < str_len(data); x++) {
*output = *data;
output++;
data++;
}
for(int x = 0; x < suffix.length(); x++) {
*output = suffix.getchar(x);
output++;
}
*output = '\0';
output -= (str_len(data)+suffix.length()+1);
delete[] data;
data = output;
}
这部分代码在测试函数的第13次测试中进行测试,如下所示:
string215 str("testing");
...
// Test 13: test that append works in a simple case.
curr_test++;
string215 suffix("123");
str.append(suffix);
if (strcmp(str.c_str(), "testing123") != 0) {
cerr << "Test " << curr_test << " failed." << endl;
failed++;
}
以下是追加类的说明:
将后缀添加到此字符串的末尾。分配一个新的,更大的阵列;将旧内容(后缀)复制到新数组;然后释放旧数组并将指针更新为新数组。
我的程序在追加函数执行结束时中止,并显示错误消息:
Debug Assertion Failed!
Program: [Source path]\dbgdel.cpp
Line: 52
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
...
Abort || Retry || Ignore
我很确定它与我糟糕的内存管理有关。我知道继续下去并不是很多,但我已经连续几个小时都在苦苦挣扎,似乎无法解决这个问题。
这是该程序的.cpp和.h文件的pastebin
string215.cpp:http://pastebin.com/Xh2SvDKJ
string215.h:http://pastebin.com/JfAJDEVN
非常感谢任何帮助!
谢谢, RAW-BERRY
答案 0 :(得分:0)
您完全output
次增加str_len(data) + suffix.length()
次。请注意,output
之后您不会增加*output = '\0';
。
所以回到开头,你应该使用:
output -= (str_len(data) + suffix.length());
顺便说一句,有些代码效率不高。例如,getchar
使用循环而不是简单地返回data[index]
。您在getchar
中使用append
,这意味着效果不佳。
编辑:正如zch所说,修改delete[] data
后使用data
,但请注意,在修改str_len(data)
之前,您使用data
(当决定要跳过多少字节时),因此计算错误(我上面的建议也是错误的,因为str_len(data)
现在为零)。
答案 1 :(得分:0)
您正在data
之前更改delete[]
指针。您需要delete[]
与new[]
完全相同的值。
此外,您正在递增output
指针str_len(data)+suffix.length()
次,然后按str_len(data) + suffix.length() + 1
将其取回。
我会使用单独的变量进行迭代来解决这些问题。
答案 2 :(得分:0)
所以我认为你的问题在于
for(int x = 0; x < str_len(data); x++) {
请注意,'data'的大小在循环的每次迭代中都在变化。当你递增'x'时,你正在减少'数据'的长度。假设'data'是一个保持“hello”的字符串:在循环的第一次迭代中,x = 0,str_len(data)= 5;在第二次迭代中,x = 1,str_len(data)= 4。因此for循环执行的次数是你需要的次数的一半,而'data'最终不会指向数据字符串的末尾