gpt4 book ai didi

C++ RAII - 我有这个权利吗?

转载 作者:行者123 更新时间:2023-11-28 07:11:45 24 4
gpt4 key购买 nike

我是 C++ 的新手,也是使用 RAII 删除分配的内存的新手。我编写这段代码作为自动分配和稍后删除字符数组所需的示例。我知道那里有一个字符串类,但我想我会先从旧的东西开始。这个样本看起来正确吗?这是其他人创建字符串并自动删除它的方式吗?

#include <iostream>

using namespace std;

class StringGetter
{
private:
char* theString;

public:
StringGetter(char* name)
{
this->theString = new char[1024];

strcpy_s(this->theString, strlen(name) + 1, name);
}

char* GetString()
{
return this->theString;
}

~StringGetter()
{
delete[] this->theString;
}
};

int main()
{
char* response;

{
StringGetter getter("testing");
response = getter.GetString();
}

cin.get(); // pauses the console window
}

最佳答案

看起来您已经掌握了主要思想,但还有几件事值得一提。

1) 正如@chris 提到的,您忘记了复制构造函数、复制赋值运算符、移动构造函数和移动赋值运算符。复制应该是手动写入或禁用,移动可以默认。 (又名你没有遵守 5 的规则)

2) 更喜欢使用std::unique_ptr 来表示所有权。它已经为您完成了所有艰苦的工作。通过将包装的字符串保存在 std::unique_ptr 中,复制/移动特殊函数的默认版本将保持正确性(尽管如果您希望启用复制操作,您仍然需要实现它们).

这可能是这样的:

class StringGetter {
public:
explicit StringGetter(char* name) {
strSize = strlen(name);
str = std::unique_ptr<char[]>(new char(strSize+1));
std::copy_n(name, strSize + 1, str.get());
}

StringGetter(const StringGetter& other) {
strSize = other.strSize;
str = std::unique_ptr<char[]>(new char(strSize+1));
std::copy_n(other.str.get(), strSize + 1, str.get());
}

StringGetter(StringGetter&& other) = default;

StringGetter& operator=(const StringGetter& rhs) {
auto temp = rhs;
swap(temp);
return *this;
}

StringGetter& operator=(StringGetter&& rhs) = default;

const char* getString() const noexcept {
return str.get();
}

void swap(StringGetter& other) {
std::swap(str, other.str);
std::swap(strSize, other.strSize);
}
private:
std::unique_ptr<char[]> str;
int strSize;
};

杂项:

1) 注意 std::unique_ptr 处理 RAII。当我在复制构造函数中替换“str”时,它会自动删除旧字符串。

2) 我调整动态分配内存的大小以匹配输入字符串。这可以防止溢出/浪费内存。

3) 构造函数是明确的。这可以防止不需要的转换。经验法则是对所有单参数构造函数使用 explicit 关键字。

4) 我将 getString 设为常量,这样您仍然可以在类的 const 实例上调用它。

5) 我用 std::copy_n 替换了 str-family 复制函数。它更通用,可以避免在晦涩的情况下出现某些陷阱。

6) 我在复制赋值运算符中使用了复制交换惯用语。这促进了代码重用/避免重复。

7) 当 C++14 发布时,将 std::unique_ptr 构造函数调用替换为 std::make_unique 以增加异常安全性并消除冗余。

关于C++ RAII - 我有这个权利吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20862985/

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