gpt4 book ai didi

c++ - 在实现 operator+= 时使用 delete[](堆损坏)

转载 作者:太空狗 更新时间:2023-10-29 23:42:42 34 4
gpt4 key购买 nike

几个小时以来,我一直在努力解决这个问题,但我已经无计可施了。如果有人能在我做错时告诉我,我将不胜感激。

我编写了一个简单的类来模拟字符串的基本功能。该类的成员包括一个字符指针data(它指向一个动态创建的字符数组)和一个整数strSize(它保存字符串的长度,无终止符。)

因为我正在使用newdelete,所以我已经实现了复制构造函数和析构函数。当我尝试实现 operator+= 时出现问题。 LHS 对象正确构建新字符串——我什至可以使用 cout 打印它——但是当我尝试在析构函数中释放数据指针时出现问题:我在指向的内存地址处收到“正常 block 后检测到堆损坏”通过析构函数试图解除分配的 data 数组。

这是我的完整类(class)和测试程序:

#include <iostream>

using namespace std;

// Class to emulate string
class Str {
public:

// Default constructor
Str(): data(0), strSize(0) { }

// Constructor from string literal
Str(const char* cp) {
data = new char[strlen(cp) + 1];
char *p = data;
const char* q = cp;
while (*q)
*p++ = *q++;
*p = '\0';
strSize = strlen(cp);
}

Str& operator+=(const Str& rhs) {
// create new dynamic memory to hold concatenated string
char* str = new char[strSize + rhs.strSize + 1];

char* p = str; // new data
char* i = data; // old data
const char* q = rhs.data; // data to append

// append old string to new string in new dynamic memory
while (*p++ = *i++) ;
p--;
while (*p++ = *q++) ;
*p = '\0';

// assign new values to data and strSize
delete[] data;
data = str;
strSize += rhs.strSize;
return *this;
}


// Copy constructor
Str(const Str& s)
{
data = new char[s.strSize + 1];
char *p = data;
char *q = s.data;
while (*q)
*p++ = *q++;
*p = '\0';
strSize = s.strSize;
}

// destructor
~Str() { delete[] data; }

const char& operator[](int i) const { return data[i]; }
int size() const { return strSize; }

private:
char *data;
int strSize;
};

ostream& operator<<(ostream& os, const Str& s)
{
for (int i = 0; i != s.size(); ++i)
os << s[i];
return os;
}


// Test constructor, copy constructor, and += operator
int main()
{
Str s = "hello"; // destructor for s works ok
Str x = s; // destructor for x works ok
s += "world!"; // destructor for s gives error
cout << s << endl;
cout << x << endl;
return 0;
}

编辑:加速 C++ 问题 12-1。

最佳答案

以下代码块使 p 指向数组旁边。

while (*p++ = *q++) ;
*p = '\0';

您在复制构造函数中使用的更好(和安全)的解决方案:

while (*q)
*p++ = *q++;
*p = '\0';

关于c++ - 在实现 operator+= 时使用 delete[](堆损坏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2754386/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com