调试断言失败!使用指针算法的字符串操作

时间:2013-03-02 00:03:15

标签: c++ pointers c-strings

编辑: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

3 个答案:

答案 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'最终不会指向数据字符串的末尾