阿鼎不是阿顶 2020-02-06 22:04 采纳率: 100%
浏览 266
已采纳

全局重载后的new与cin连用为什么可能进入死锁状态

在读https://blog.csdn.net/zxx910509/article/details/64905107
不理解第二个红标题里函数说明中的一句话。
请看下文

#include <stdio.h>
#include<stdlib.h>
void *operator new(size_t sz)
{
    printf("operator new:%d Bytes\n",sz);
    void *m=malloc(sz);
    if(!m)
    puts("out of memory");
return m;
}
void operator delete(void *m)
{
    puts("operator delete");
    free(m);
}
class S
{
    int i[100];
    public:
    S(){puts("S:S()");}
    ~S(){puts("~S::S()");}
};
int main( )
{
    puts("(1)Creating & Destroying an int");
    int *p=new int(47);//输出数据4,因为int后的()用于初始化
    delete p;
    puts("(2)Creating & Destroying an S");
    S *s=new S;//输出400,因为有一个元素个数为100的int整型数组
    delete s;
    puts("(3)Creating & Destroying S[3]");
    S *sa=new S[3];//输出1204,因为有三个类型为S的对象,重载后new函数返回值必为一个长度大于1200的指针
    delete []sa;
    return 0;
} 

函数说明:
使用printf()和puts()而不是iostream,是因为创建一个iostream对象时(像全局的cin/cout/cerr),它们调用new去分配内存。用printf()不会进入死锁状态,因为它不会调用new来初始化自身。
在说明里说用cin和cout可能会进入死锁状态,是怎么进入的?
大佬们教教小弟,不懂啊

  • 写回答

2条回答 默认 最新

  • threenewbee 2020-02-06 23:02
    关注

    iostream会调用new,你在new的重载函数里又调用iostream……
    如此这般,会导致无限递归(说死锁应该是不准确的)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号