首先是个自定义类
class Widget{
private:
int n;
public:
Widget(int v):n(v) {std::cout<<"第"<<n<<"已经构造";}
~Widget(){std::cout<<"第"<<n<<"已经析构";}
void show_n()const{std::cout<<"当前值为"<<n;}
然后首先调用
Widget* widget = static_cast<Widget*>(::operator new(sizeof(Widget)));
widget = new Widget(10); //语句 1
widget->show_n();
widget->~Widget();
::operator delete(widget);
这段代码编译运行正常,win10+VS2019,64 位,运行结果为
第 10 已经构造 当前值位 10 第 10 已经析构
然后另一段测试代码,用 operator new 开辟可以存放多个 Widget 的内存
Widget* widget = static_cast<Widget*>(::operator new(sizeof(Widget)*10));
Widget* widget_tmp = widget;
for(int i = 0 ; i < 10 ; ++i){
widget_tmp = new Widget(i); //语句 2
widget_tmp += 1;
}
这段代码编译运行同样没有问题,运行把每个构造函数中的语句都正确的打印出来了
然后是
(widget + 5) -> show_n(); //语句 3
这句直接报错,VS 提示我访问了错误的内存
然后我把语句 2 改成了
new (widget_tmp) People(i); //语句 4
这样就语句 3 就不会报错,也正确的打印的输出信息,开始以为是申请多个对象内存要用 new[],于是我把申请内存的语句改为
Widget* widget = static_cast<Widget*>(::operator new[](sizeof(Widget)));
我发现问题还是一样,如果使用语句 2 生成对象就报错,必须采用语句 4 的方式
我向问下为什么语句 1 和语句 2 用相同的方法生成对象,但语句 3 却要报错?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.