【神秘RE】关于类的构造函数可能导致的 RE
  • 板块学术版
  • 楼主Moeebius
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/8/13 20:41
  • 上次更新2023/10/27 15:33:43
查看原帖
【神秘RE】关于类的构造函数可能导致的 RE
356003
Moeebius楼主2022/8/13 20:41

RT.

我在尝试解决一道题时,写下了这样的代码:

...
class CoreDS
{
	public:
	#define lc(x) (x<<1)
	#define rc(x) ((x<<1)|1)
	struct Node
	{
		int l,r,rt;
	}T[MAXN<<2];
	SegTree tr;
	CoreDS(){}
	CoreDS(int len){build(1,0,len);}//构造函数
	il void build(int p, int l, int r)
	{
		T[p].l=l,T[p].r=r;
		if(l==r) return;
		int mid=(l+r)>>1;
		build(lc(p),l,mid),build(rc(p),mid+1,r);
	}
	il int kth(int p, int ql, int qr, ll k)
	{
		int l=T[p].l,r=T[p].r;
		if(l==r) 
		{
			return l;
		}
		ll cnt=tr.query(T[lc(p)].rt,1,n,ql,qr);
		if(cnt>=k) return kth(lc(p),ql,qr,k);
		else       return kth(rc(p),ql,qr,k-cnt);
	}
	il void insert(int p, int ql, int qr, int x)
	{
		int l=T[p].l,r=T[p].r;
		tr.add(T[p].rt,1,n,ql,qr,1ll);
		if(l==r) return;
		int mid=(l+r)>>1;
		if(mid>=x) insert(lc(p),ql,qr,x);
		else       insert(rc(p),ql,qr,x);
	}
};

CoreDS a;
signed main()
{
	read(n,m);
	a.build(1,0,n<<1); // 看这一行!
    ...
}    

他运行得很不错,并取得了 AC。

但是如果我把代码改成这样:

...
//前面不变

signed main()
{
	read(n,m);
	a=CoreDS(n<<1);
    ...
}

就会发现程序在执行 main 函数之前发生段错误!

sanitizer 的报错如下:

AddressSanitizer:DEADLYSIGNAL
==========================================
==22841==ERROR: AddressSanitizer: stack-overflow on address 0x7ff79e1ae5c0 (pc 0x00010aa89b24 bp 0x7ff7b5478840 sp 0x7ff79e1ae520 T0)
    #0 0x10aa89b24 in main+0x64 (t:x86_64+0x100002b24)
    #1 0x12e0854d4 in start+0x1a4 (dyld:x86_64+0x54d4)

SUMMARY: AddressSanitizer: stack-overflow (t:x86_64+0x100002b24) in main+0x64
==22841==ABORTING

请问这是为什么 qwq

按理讲构造函数还没有被执行啊(

2022/8/13 20:41
加载中...