C++ 在for循环c+中创建对象+;
我有这个:C++ 在for循环c+中创建对象+;,c++,arrays,object,C++,Arrays,Object,我有这个: void Queue::testMethod(){ this->theQueue.clear(); for (int i = 0; i < 3 ; i ++ ){ char *uu = new char[3]; uu[0] = 'd'; uu[1] = static_cast<char>(i); uu[2] = 'r'; MyClass tt(uu, 7); this->theQueue.push_back
void Queue::testMethod(){
this->theQueue.clear();
for (int i = 0; i < 3 ; i ++ ){
char *uu = new char[3];
uu[0] = 'd';
uu[1] = static_cast<char>(i);
uu[2] = 'r';
MyClass tt(uu, 7);
this->theQueue.push_back(tt);
}
}
string Queue::PrintData(){
string data;
for ( int i = 0 ; i < this->theQueue.size(); i ++){
data += this->theQueue.at(i).PrintData();
}
return data;
}
我主要做以下几点:
MyClass myClass1((char *)"1111", 3);
MyClass myClass2((char *)"1111", 3);
MyClass myClass3((char *)"2222", 3);
vector<MyClass> tmpVector;
tmpVector.push_back(myClass1);
tmpVector.push_back(myClass2);
tmpVector.push_back(myClass3);
Queue tmpQueue(tmpVector);
tmpQueue.testMethod();
cout << tmpQueue.PrintData() << endl;
你有未定义的行为。在构造函数
MyClass::MyClass(char*am,int number)
中,通过
int i = strlen(am);
C样式字符串以null结尾。因此,这将在am
中查找\0
。这适用于字符串文本,如
MyClass myClass1((char *)"1111", 3);
因为它们自动包含终止的\0
。在Queue::testMethod()
中,第一个迭代也可以工作,因为第二个字符
uu[1] = static_cast<char>(i);
uu[1]=static_cast(i);
是空字符(因为此时i
是0
)strlen
在索引1处查找此空字符,因此返回长度1,因此仅打印r
get。对于任何i>0
缓冲区uu
不包含终止空字符,因此strlen
读取数组边界之外的内容,这是未定义的行为。int i=strlen(am)代码>要求am是以nul结尾的字符串,但它不是。
MyClass myClass1((char *)"1111", 3);
uu[1] = static_cast<char>(i);