gpt4 book ai didi

c++ - 使用传入数组初始化其他数组

转载 作者:行者123 更新时间:2023-11-28 01:49:37 25 4
gpt4 key购买 nike

我正在尝试“初始化”我在类声明中创建的数组,但我不知道自己做错了什么。我知道当您将数组传递给函数时,它会衰减为指向第一个字符的指针。代码在我的第二个 strcpy() 行中断,但我不确定我做错了什么(我对 strcpy() 的经验很少)。

我的代码如下:

class TestClass
{
public:
TestClass(char []);
~TestClass();
void Append(TestClass);

char* m_string;
};

TestClass::TestClass(char incstring[])
{
char currentChar = 'a';
int numOfChars = 0;

while (currentChar != '\0') {
currentChar = *(incstring + numOfChars);
numOfChars++;
}

char* tmp = new char[numOfChars-1];
strcpy(tmp, incstring);
strcpy(m_string, tmp);
}

我的 int main() 很简单:

int main(){
TestClass* test = new TestClass("Hello");
}

如果值得注意,numOfChars 等于 6,这是正确的。

抛出的异常是:“访问冲突写入位置 0xCDCDCDCD。”

最佳答案

在将数据从 tmp 复制到 m_string 之前,您没有为 m_string 分配任何内存。这就是你崩溃的原因。 m_string 未指向有效的内存地址。

因为你已经分配了tmp并且你不会再使用它,你可以直接将tmp指针分配给m_string无需执行另一个拷贝。

此外,请注意您的 while 循环正在复制 strlen() 已经完成的工作,因此您应该只使用 strlen()

试试这个:

TestClass::TestClass(char incstring[])
: m_string(new char[strlen(incstring)+1])
{
strcpy(m_string, incstring);
}

TestClass::~TestClass()
{
delete[] m_string;
}

可以使用 strdup() 来简化(使用 free() 而不是 delete[] 来释放它):

TestClass::TestClass(char incstring[])
: m_string(strdup(incstring))
{
}

TestClass::~TestClass()
{
free(m_string);
}

话虽如此,您的 main() 正在泄漏内存,因为您没有释放 test 对象:

int main(){
TestClass* test = new TestClass("Hello");
//...
delete test; // <-- add this
}

或者简单地说:

int main(){
TestClass test("Hello");
}

最后,确保您实现了 Rule of Three在你的课上。您正在管理在析构函数中释放的动态内存,因此您还需要一个复制构造函数和一个复制赋值操作,以确保在从其他创建 TestClass 值时 m_string 的完整性TestClass 值:

class TestClass
{
private:
char* m_string;

public:
TestClass(char *incstring = 0);
TestClass(const TestClass &src);
~TestClass();

void Append(const TestClass &str);
void Swap(TestClass &Other);

TestClass& operator=(const TestClass &lhs);
};

TestClass::TestClass(char *incstring)
: m_string(0)
{
if (incstring)
{
m_string = new char[strlen(incstring)+1];
strcpy(m_string, incstring);
}
}

TestClass::TestClass(const TestClass &src)
: m_string(0)
{
if (src.m_string)
{
m_string = new char[strlen(src.m_string)+1];
strcpy(m_string, src.m_string);
}
}

TestClass::~TestClass()
{
delete[] m_string;
}

void TestClass::Append(const TestClass &str)
{
if (str.m_string)
{
TestClass tmp;
tmp.m_string = new char[strlen(m_string)+strlen(str.m_string)+1];
strcpy(tmp.m_string, m_string);
strcat(tmp.m_string, str.m_string);
Swap(tmp);
}
}

void TestClass::Swap(TestClass &Other)
{
char *ptr = m_string;
m_string = Other.m_string;
Other.m_string = ptr;
}

TestClass& TestClass::operator=(const TestClass &lhs)
{
if (this != &lhs) {
TestClass(lhs).Swap(*this);
}
return *this;
}

关于c++ - 使用传入数组初始化其他数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43531933/

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