0

编辑:Pastebin 链接到底部的全部代码

在我的 CS215 课程中,我获得了一个名为 String215 的类,它是一个基本的字符串类,用于帮助理解动态内存分配和 char 数组的指针运算。

该课程以非常基本的骨架形式提供给我,其中包含原型但没有实现,以及用于测试我的实现的测试函数。我不能在这个作业中使用任何 C 字符串函数。

程序中麻烦的部分是 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

非常感谢任何帮助!

谢谢,生浆果

4

3 回答 3

0

您之前正在更改data指针delete[]。您需要与delete[]从中获得的值完全相同new[]

此外,您正在增加output指针str_len(data)+suffix.length()时间,并将其收回str_len(data) + suffix.length() + 1.

我会使用单独的变量进行迭代来解决这些问题。

于 2013-03-02T00:21:34.987 回答
0

所以我认为你的问题出在这条线上

for(int x = 0; x < str_len(data); x++) {

请注意,“数据”的大小在循环的每次迭代中都在变化。当您增加“x”时,您正在减少“数据”的长度。假设 'data' 是一个包含“hello”的字符串:在循环的第一次迭代中 x=0 和 str_len(data)=5; 在第二次迭代中 x=1 和 str_len(data)=4。因此,for 循环执行的次数是您需要的一半,并且“数据”最终不会指向数据字符串的末尾

于 2013-03-02T01:17:44.317 回答
0

output精确地增加str_len(data) + suffix.length()时间。请注意,您不会output*output = '\0';.

所以要回到开始,你应该使用:

output -= (str_len(data) + suffix.length());

顺便说一句,有些代码效率不高。例如,getchar使用循环而不是简单地返回data[index]. 您使用getcharin append,这意味着性能不是很好。

编辑:正如 zch 所说,您delete[] data在修改后使用data,但请注意,即使在此之前您str_len(data)在修改后使用data(在决定要跳过多少字节时),所以计算是错误的(我上面的建议也是错误的,因为str_len(data)现在零)。

于 2013-03-02T00:19:30.607 回答