Redian新闻
>
大盘日内又新高了
avatar
大盘日内又新高了# Stock
w*s
1
http://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/
以一个简单的 string 类为示例,实现拷贝构造函数和拷贝赋值操作符。
示例程序 :
class MyString {
private:
char* _data;
size_t _len;
void _init_data(const char *s) {
_data = new char[_len+1];
memcpy(_data, s, _len);
_data[_len] = '
avatar
w*s
2
avatar
m*m
3
是真的吗?IMB的SENIOR就写出这东西?
avatar
s*n
4
not much change
avatar
w*s
5
没人看出bug么?
class MyString {
private:
char* _data;
size_t _len;
void _init_data(const char *s) {
_data = new char[_len+1];
memcpy(_data, s, _len);
_data[_len] = '\0';
}
public:
MyString() {
_data = NULL;
_len = 0;
}
MyString(const char* p) {
_len = strlen (p);
_init_data(p);
}
MyString(const MyString& str) {
_len = str._len;
_init_data(str._data);
std::cout << "Copy Constructor is called! source: " << str._data << std:
:endl;
}
MyString& operator=(const MyString& str) {
if (this != &str) {
_len = str._len;
_init_data(str._data);
}
std::cout << "Copy Assignment is called! source: " << str._data << std::
endl;
return *this;
}
virtual ~MyString() {
if (_data) free(_data);
}
};
int main() {
MyString a;
a = MyString("Hello");
std::vector vec;
vec.push_back(MyString("World"));
}
avatar
l*y
6
我看不出来,谁给讲讲

【在 w********s 的大作中提到】
: 没人看出bug么?
: class MyString {
: private:
: char* _data;
: size_t _len;
: void _init_data(const char *s) {
: _data = new char[_len+1];
: memcpy(_data, s, _len);
: _data[_len] = '\0';
: }

avatar
f*4
7
原标题是C++11 标准新特性: 右值引用与转移语义
我的理解是这个MyString只是用来示例用的。
要是把_init_data里面_data delete掉,用了右值引用与转移_data应该是undefined/
invalid状态

【在 w********s 的大作中提到】
: 没人看出bug么?
: class MyString {
: private:
: char* _data;
: size_t _len;
: void _init_data(const char *s) {
: _data = new char[_len+1];
: memcpy(_data, s, _len);
: _data[_len] = '\0';
: }

avatar
a*s
8
明显的一个错误是 new []/free 配一对。
很奇怪的用法是void _init_data()函数,居然要在函数外赋长度值,然后在函数内用
其做拷贝,很诡异。
一个不严谨memcpy,最好是memcpy(_data, s, sizeof(char)*_len); 默认char为一个
byte不是好习惯。
另一个不严谨的是析构函数里,释放内存后,_data应置NULL,_len应置0.
原网页中,在实现的转移赋值函数里,没有先释放被赋值对象的内存,直接进行指针赋
值,严重的内存泄漏。
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。