c++ - 如果我在 C++ 中以 new 的放置形式使用的内存不足会怎样?

标签 c++

我研究过新的放置形式,但我没有弄清楚。他们说 new 的放置形式允许你从已经分配的内存中创建一个对象。但是看下面的代码。

#include <iostream>

using namespace std;

class ex
{
 public:
  int x;
  int y;
  double z;
    ex()
    {
     cout<<"constructor";
    }
    ~ex()
    {
        cout<<"destructor";
    }
};

int main()
{
   char *pt=new char;

   ex *p;
   p=new(pt) ex();
   p->x=4444;
   p->y=3333;
   p->z=65.87879898;
   cout<<"\n"<<p->x<<"\n"<<p->y<<"\n"<<p->z<<"\n";
   p->~ex();

   free(pt);
   return 0;
}

我预计上面的代码无法运行,但它成功运行产生了以下输出:

 constructor
 4444
 3333
 65.8788
 destructor
 Process returned 0 (0x0)   execution time : 0.106 s
 Press any key to continue.

这段代码如何运行?

我不清楚 new 的放置形式,所以请任何人用示例代码解释这个概念和语法。请任何人。

谢谢。

最佳答案

此代码正在使用未分配的内存。

这并不意味着它必须崩溃,更多的是在“意外结果”领域。

这段代码可以而且很可能会崩溃,如果运行很长时间,一旦你的内存损坏将覆盖一些重要的东西/访问进程分配的页面限制之外的内存。

关于c++ - 如果我在 C++ 中以 new 的放置形式使用的内存不足会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59337322/

相关文章:

c++ - 确定枚举类中枚举的数量(或任何枚举类中的特定枚举值)

c++:堆栈上的数据没有初始化

c++ - 隐式向上转换时如何确定偏移量?

c++ - 链接器错误;找不到结构中的静态变量

c++ - 当 unsigned char 被视为数组时,C++ 如何看待指向它的指针?

c++ - 这是对花括号初始化列表的不安全使用吗?

c++ - 在 if 语句中使用 strtok 标记

c++ - 使用 c/awk/shell 对二维数据进行双线性插值

c++ - 在多线程环境中管理 sqlite 数据库

c++ - C++中删除数组中的元素