【发布时间】:2023-04-06 08:51:01
【问题描述】:
我正在尝试创建一个包含指针的类,它是动态数组的核心。 如何重载运算符 >> 这样我就可以在不知道要放置多少个字符的情况下将 cin >> 指向指针? 我正在尝试:
#include <iostream>
class MyString
{
private:
char* str;
size_t length;
public:
//some code here
friend std::istream& operator>>(std::istream& is, const MyString& other)
{
is >> other.str;
return is;
}
}
这发生在我尝试 cin 字符串时: HEAP CORRUPTION DETECTED
有没有办法读取字符串,将其分配给我的字符串,并且不使用 std::string 标头? (我试图创建一个不依赖于 std::string 的字符串类)
【问题讨论】:
-
一个简单的实现会使用
is.get()一次检索一个字符,并将其附加到str,如果需要调整大小。当然,当std::isspace(chr)为真时停止。为此,您需要动态分配内存并跟踪您正在使用/有多少可用空间。 -
您的类中的
str成员需要初始化,以便在读取之前指向某个对象(例如动态分配的内存)(例如is >> other.str)。如图所示,str未初始化,因此is >> other.str给出未定义的行为。通常,用于初始化目的的动态内存分配是在构造函数中完成的 - 如果需要调整动态分配的内存大小,则有必要编写以下代码:(1) 分配新内存块 (2) 将数据从旧内存块复制到新内存块 (3) 释放旧内存块。 -
还要注意指针不是数组。成员
str是一个指针,并且该指针未初始化(因此没有特别指向任何东西)。如果您想编写模拟数组的代码,一个关键的考虑因素是要了解指针和数组之间存在非常真实的差异(即使它们可以在某些上下文中互换使用,它们也不是一回事,所以不是总是可以互换的)。
标签: c++ operator-overloading cin dynamic-arrays istream