#include <iostream>
using namespace std;
class X {
public:
X() {
cout << "hahaha ";
}
int j;
};
int main() {
X* p = new X;
p[0].j = 0;
p[1].j = 1;
cout << p[1].j;
}
为什么p[1]仍然能被赋值,且不调用构造函数
#include <iostream>
using namespace std;
class X {
public:
X() {
cout << "hahaha ";
}
int j;
};
int main() {
X* p = new X;
p[0].j = 0;
p[1].j = 1;
cout << p[1].j;
}
为什么p[1]仍然能被赋值,且不调用构造函数
【以下回答由 GPT 生成】
动态存储中的越界赋值会导致未调用构造函数,是因为在C++中,对动态存储分配的内存进行越界访问是未定义行为(Undefined Behavior)。在上述代码中,对p[1]
进行赋值实际上是超出了new X
所分配的内存空间,这会导致未定义行为,包括不调用构造函数。
要解决这个问题,应该确保在使用动态存储分配的内存时不要越界访问,可以通过动态数组或者容器来管理内存的分配和访问,例如使用std::vector
:
#include <iostream>
#include <vector>
using namespace std;
class X {
public:
X() {
cout << "hahaha ";
}
int j;
};
int main() {
vector<X> p(2);
p[0].j = 0;
p[1].j = 1;
cout << p[1].j;
}
这样就可以避免对动态分配的内存进行越界访问,确保构造函数会被正确调用。
【相关推荐】