jumpjn
猫又酱o(=•ェ•=)m
2020-02-06 22:04

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

  • c++

在读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条回答