当我运行程序时,它会抛出错误:
invalid address specified to RtlValidateHeap( 00530000, 00A39B18 )
我认为这是因为realloc,但我不明白为什么。我必须使用malloc,realloc和free而不是new和delete。 我的.h文件:
#pragma once
class String
{
private:
char* mas;
int n;
public:
String();
void EmptyStr();
void print();
void operator = (char* str);
void operator = (const String &a);
String operator+ (char* str);
String operator + (const String &a);
void operator += (char*);
void operator += (const String &a);
char &operator [] (int i);
};
我的.cpp文件:
#include"Strings.h"
#include<stdlib.h>
#include<iostream>
String::String()
{
this->mas = NULL;
this->n = 0;
}
void String::print()
{
std::cout << this->mas << ' ' << this->n << std::endl;
}
void String::EmptyStr()
{
this->mas = (char*)realloc(this->mas, sizeof(char));
this->n = 0;
this->mas[0] = '\0';
}
void String::operator =(char* str)
{
this->n = strlen(str);
this->mas = (char*)realloc(this->mas, (this->n + 1) * sizeof(char));
this->mas = str;
}
void String::operator=(const String &a)
{
this->mas = (char*)realloc(this->mas, (a.n + 1)* sizeof(char));
this->n = a.n;
*this = a.mas;
}
String String::operator+(char* str)
{
String tmp;
tmp.mas = (char*)malloc((this->n + strlen(str)+1) * sizeof(char));
tmp.n = this->n + strlen(str);
tmp.mas[0] = '\0';
strcat(tmp.mas, this->mas);
strcat(tmp.mas, str);
return tmp;
}
String String::operator+(const String &a)
{
String tmp;
tmp.mas = (char*)malloc((this->n + a.n + 1) * sizeof(char));
tmp.n = this->n + a.n;
tmp = *this + a.mas;
return tmp;
}
void String::operator+=(char* str)
{
*this = *this + str;
}
我的主要.cpp文件
#include"Strings.h"
#include <iostream>
int main()
{
String a, b, c;
a = "Hello";
b = "ASD";
b = a;
b.print();
system("PAUSE");
}
我真的无法理解错误,所以我希望你能帮助我。
答案 0 :(得分:0)
问题在于:
this->mas = (char*)realloc(this->mas, (this->n + 1) * sizeof(char));
this->mas = str;
第一行分配内存,并使mas
指向新分配的内存。第二行使mas
完全指向其他地方。在这里,您不应该仅仅指向指向其他位置的指针,而是使用例如复制字符串。 strcpy
使用现在的代码,当你做
时b = "ASD";
你使b.mas
指向字符串文字中的第一个字符。然后当你做
b = a;
您在realloc
调用中使用指向字符串文字的指针,这是错误的,因为您尚未通过malloc
或realloc
分配该内存。
另一方面,你永远不应该回到传递给realloc
的指针。如果realloc
失败并返回空指针,则会丢失原始指针并导致内存泄漏。