gpt4 book ai didi

c++ - 在 char 数组包装器类中实现 C++ setter 的正确方法是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 00:45:47 24 4
gpt4 key购买 nike

我正在研究仅包含一个字符数组及其大小(以字节为单位的长度)的类。目前,我想为此类重载“+”操作数(以实现串联)。构造函数工作正常。对象已创建,我可以在调试器中看到它们的字段和值。我被困在使用“+”的地方(主要(第 13 行))。代码编译得很好,甚至没有警告,但是当我运行它时,我的程序失败并显示“无效指针消息”。我找到了那个无效指针的确切位置。它在“+”实现中(BufferArray.cpp,第 39 行)。当我调用 SetBuffer 时,char 数组被正确分配(我在运算符实现范围内看到它的值为“qwasd”),但就在下一行,当我调用 SetSize 时它消失了。我不知道为什么。

我的 setter 有什么问题,在这种情况下我该如何实现“+”操作数?

提前致谢。

这是我使用的代码:

BufferArray.h:

#include <string.h>
#include <stdio.h>

#ifndef BUFFERARRAY_H
#define BUFFERARRAY_H
class BufferArray {
public:
BufferArray(char* reservedPlace);
BufferArray();
void SetSize(int sz);
int GetSize();
void SetBuffer(char* buf);
char* GetBuffer();
BufferArray operator+ (BufferArray bArr) const;
virtual ~BufferArray();
private:
int size;
char *buffer;
};

#endif /* BUFFERARRAY_H */

实现在下一个文件 BufferArray.cpp:

#include "BufferArray.h"

// Constructors.
BufferArray::BufferArray(){
size = 0;
strcpy(buffer, "");
}
BufferArray::BufferArray(char* reservedPlace) {
size = strlen(reservedPlace);
buffer = reservedPlace;
}

// Getters and setters.
void BufferArray::SetSize(int sz)
{
size = sz;
}
int BufferArray::GetSize()
{
return size;
}
void BufferArray::SetBuffer(char* buf)
{
buffer = buf;
}
char* BufferArray::GetBuffer()
{
return buffer;
}

// Operator +.
BufferArray BufferArray::operator+ (BufferArray bArr) const
{
char tempCharArray[strlen(buffer) + strlen(bArr.GetBuffer())];
strcpy(tempCharArray, buffer);
strcat(tempCharArray, bArr.GetBuffer());
BufferArray tempBA;
tempBA.SetBuffer(tempCharArray);
tempBA.SetSize(strlen(bArr.GetBuffer()) + strlen(buffer)); // Vanishes buffer field.
printf("%d",tempBA.GetSize());
return tempBA;
}

// Destructor.
BufferArray::~BufferArray() {
// Destroy the pointer.
delete [] buffer;
}

主要函数:

#include <cstdlib>
#include <iostream>
#include "BufferArray.h"
using namespace std;

int main(int argc, char** argv) {
BufferArray ba1;
char tmp1[3] = "qw";
char tmp2[4] = "asd";
ba1.SetSize(strlen(tmp1));
ba1.SetBuffer(tmp1);
BufferArray ba2(tmp2);
BufferArray ba3 = ba1 + ba2; // Runtime error is here.
cout << ba3.GetBuffer() << endl;
return 0;
}

最佳答案

在 BufferArray::operator+ 中,tempCharArray 是一个临时缓冲区,将在函数完成时被销毁。基本上有两种方法可以处理这个问题:

1/在 operator+ 中使用 new[] 分配临时缓冲区,这样你将确保缓冲区在对 operator+ 的调用中幸存下来,但你要么有内存泄漏,要么要求调用者稍后调用 delete[] ,这是相当笨拙且容易出错的

2/或更好,修改 setBuffer 以便它执行缓冲区的内部拷贝并在您自己的析构函数中添加对 delete[] 的调用:

BufferArray::~BufferArray() {
delete[] buffer;
}

void BufferArray::setBuffer(char *otherBuffer) {
buffer = new char[strlen(otherBuffer) + 1];
strcpy(buffer, otherBuffer);
}

请注意,您必须修改构造函数,以便它也复制输入缓冲区(否则当对象被销毁时,您将非法调用 delete[]),然后您可能想要重载复制-构造函数和赋值运算符,以防止浅拷贝导致两次删除缓冲区。

在实际的生产代码中,您可能希望使用某种托管指针来避免自己进行删除(例如 std::vector 或 boost::shared_array),但对于家庭作业,上述解决方案应该没问题。

附带说明一下,在使用 strlen 确定缓冲区大小时不要忘记添加 +1 ;)

关于c++ - 在 char 数组包装器类中实现 C++ setter 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6087056/

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