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
按理讲构造函数还没有被执行啊(