【发布时间】:2014-07-25 11:41:12
【问题描述】:
我有以下名为 DATA 的类。
enum DATATYPE{DATATYPE_CONSTANT=0, DATATYPE_NUMBER,DATATYPE_STRING, DATATYPE_MATRIX, DATATYPE_OBJECT};
struct DATA //A Data container for the variable
{
DATA(DATATYPE type,int row=0,int col=0)
{
m_str=0;m_number=0;
m_DataType=type;
if(type==DATATYPE_NUMBER) m_number=new double;
if(type==DATATYPE_STRING) m_str=new string("");
cout<<"In constructor"<<endl;
//if(type==DATATYPE_MATRIX) m_matrix= new MatrixXd(row,col);
}
~DATA()
{
if(m_str) m_str->clear();
if(m_number) {delete m_number; m_number=0;}
std::cout<<"In Destructor"<<std::endl;
//if(m_matrix) {delete m_matrix; m_matrix=0;}
}
DATA(const DATA& other)
{
m_number=other.m_number;
m_str=other.m_str;
m_DataType=other.m_DataType;
cout<<"In copy constructor"<<endl;
}
DATA& operator=(const DATA& other)
{
m_number=other.m_number;
m_str=other.m_str;
m_DataType=other.m_DataType;
cout<<"In operator="<<endl;
return *this;
}
DATATYPE GetType()
{
return m_DataType;
}
double* GetNumber()
{
return m_number;
}
void SetNumber(const double& val){*m_number=val;}
string* GetString()
{
return m_str;
}
private:
DATATYPE m_DataType;
string* m_str;
//MatrixXd* m_matrix;
double* m_number;
};
我有以下测试:
DATA GetData();
int main()
{
cout<<"Before GetData call"<<endl;
DATA dat=GetData();
//DATA dat2=dat;
cout<<*(dat.GetNumber())<<endl;
cout<<"After Get Data call"<<endl;
cout << "Exiting main" << endl;
return 0;
}
DATA GetData()
{
cout<<"In Get Data"<<endl;
DATA ret(DATATYPE_NUMBER);
double d=5;
ret.SetNumber(d);
cout<<"Exiting GetData"<<endl;
return ret;
}
运行测试后输出为:
GetData 调用之前
在获取数据中
在构造函数中
正在退出 GetData
5
Get Data 调用后
退出主程序
在析构函数中
我有以下问题:
当我调用
DATA dat=GetData();时,它既不调用构造函数、复制构造函数也不调用相等运算符。 dat 对象是如何构造的。从GetData返回时编译器究竟做了什么?对于
DATA结构或一般的聚合数据类型,使用new初始化成员变量总是一个好主意吗?当我初始化说DATA *d=new DATA(DATATYPE_NUMBER)时,成员变量会发生什么?内存泄漏是否更容易出错?
【问题讨论】:
-
#1。 #2:不,使用常规变量,而不是指针。您对类所做的任何副本现在都会导致内存泄漏(实际上,您首先制作的任何对象也会导致泄漏)。
-
3.尝试切换到 C++11 模式并使用范围枚举。此外,更少的大写。
-
也学习使用命名空间。
using namespace std;是一个交易破坏者。 -
整个代码实际上是在一个命名空间中;但是,为了方便起见,我更喜欢从命名空间中“提取”它。
标签: c++