c++返回值优化问题

Kang_TJU 2017-06-27 07:56:33
小弟写了一个MyString类测试返回值优化的情况,主要是想看下,对于转换构造函数在不进行优化时,是否先调用转换构造函数生成临时对象,然后调用拷贝构造函数生成左值对象,然后析构临时对象,最后析构左值对象。
下面的代码在优化时没有任何问题,但是开启 -fno-elide-constructors选项时,会出现段错误,求大神指导?
我的测试环境是ubuntu 14.04 g++ 4.8.4,编译时采用命令 g++ -g -fno-elide-constructors -o main main.cpp


#include <iostream>
#include <cstring>

class MyString{
public:
typedef size_t size_type;

public:

MyString(){}
explicit MyString( int n, char ch = 0 ) : n_(n) {
ptr_ = new char[n_ + 1];
for( int i = 0; i < n_; ++i ){
ptr_[i] = ch;
}
ptr_[n_] = 0;
}
MyString( const char* str ){
std::cout << "conversion constructor called!" << std::endl;
int n_ = strlen(str);

ptr_ = new char[ n_ + 1 ];
strncpy( ptr_, str, n_ + 1);

}
MyString( const MyString& rhs ){
std::cout << "copy constructor called!" << std::endl;
n_ = rhs.size();
ptr_ = new char[n_ + 1];

for( int i = 0; i < n_; ++i ){
ptr_[i] = rhs.ptr_[i];
}
ptr_[n_] = 0;
}
MyString& operator=( const MyString& rhs ){

std::cout << "assignment function called!" << std::endl;

if( &rhs != this ){

delete [] ptr_;
n_ = rhs.size();
ptr_ = new char[n_ + 1];

for( int i = 0; i < n_; ++i ){
ptr_[i] = rhs.ptr_[i];
}
ptr_[n_] = 0;

}
return *this;
}

~MyString(){
std::cout << "destructor called!" << std::endl;
delete [] ptr_;
}


size_type size() const { return n_; }

friend std::ostream& operator<<( std::ostream& os, const MyString& s );

private:
char* ptr_;
int n_;
};

std::ostream& operator<<( std::ostream& os, const MyString& s ){
if( os ){
os << s.ptr_;
}
return os;
}

int main(){

MyString s2 = "hello, world!";
std::cout << s2 << std::endl;


}
/*
希望看到的输出如下:
conversion constructors called!
copy constructors called!
destructors called!
hello, world!
destructors called!
实际的输出如下:
conversion constructor called!
copy constructor called!
段错误 (核心已转储)
*/
...全文
87 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
www_adintr_com 2017-06-27
  • 打赏
  • 举报
回复
代码第 20 行: int n_ = strlen(str); 改成 n_ = strlen(str); 你那样写定义了一个局部变量, 类的成员变量 n_ 没有得到初始化, 其值是随机的. 后面可能产生各种未定义行为, 崩溃算是其中之一.

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧