C++ C++;堆栈变量和函数的奇怪行为
我有一个C++ C++;堆栈变量和函数的奇怪行为,c++,variables,stack,rule-of-three,C++,Variables,Stack,Rule Of Three,我有一个String类,它有一个char*buffer和一个unsigned int length string类有两个构造函数: String(const char* str); String(const String& other); 还有一个析构函数 ~String() 使用delete[]缓冲区删除字符数组 两个构造函数都创建一个新的缓冲区数组buffer=newchar[size]并用常量字符*字符串或常量字符串和其他中的正确数据填充。字符串缓冲区以null结尾 在我的主
String
类,它有一个char*buffer
和一个unsigned int length
string类有两个构造函数:
String(const char* str);
String(const String& other);
还有一个析构函数
~String()
使用delete[]缓冲区删除字符数组代码>
两个构造函数都创建一个新的缓冲区数组buffer=newchar[size]
并用常量字符*字符串
或常量字符串和其他
中的正确数据填充。字符串缓冲区以null结尾
在我的主要函数中,我有以下代码:
int main() {
String a("Hello");
a = a.Replace('l', 'p');
printf("%s\n", a.char_ptr());
}
我希望它将Heppo
打印到控制台。replace
函数使用两个字符,其中第一个字符的所有匹配项都替换为第二个字符。它返回一个全新的字符串
:
String String::Replace(const char& a, const char& b) {
const char* buf = ...;
// Do the replacement and store the result in buf
String s(buf);
delete[] buf;
return s;
}
据我所知,编译器将返回局部变量s
的副本。因此,main()
中的a
变量应该是完全合法的字符串。但是控制台的输出看起来像是的
,看起来像是未初始化的内存
更奇怪的是,当我将主要方法更改为:
int main() {
String a("Hello");
String b = a.Replace('l', 'p');
printf("%s\n", b.char_ptr());
}
我看到了预期的产出。经过大量阅读,我无法找到解决方案,因为这是一个在google/stackoverflow搜索中很难描述的问题。主要问题是违反了big 3的规则。因为您有一个非平凡的分解结构,所以还必须定义一个复制构造函数和赋值运算符。
在执行上述功能时,可以考虑复制交换习语。
如果在存在非平凡析构函数的情况下不定义这两个函数中的任何一个,则会导致资源(本示例中的内存)泄漏。您需要一个赋值运算符a=a.Replace('1','p')代码>您是否定义了复制分配运算符?请看一看,这是有意义的。oprator的返回值应该是多少?我在想一个简单的字符串:String String::opreator=(const String&other)
Copy赋值应该返回String&
,而不是String
。