答案上的代码如下:
#include <iostream>
#include <stddef.h>
#include <cassert>
struct Histogram{
Histogram(ptrdiff_t minval, size_t gap, size_t n_bins);
~Histogram(){ delete[] bin_; }
void record(ptrdiff_t);
void output_to(std::ostream&);
private:
ptrdiff_t const minval_, maxval_;
size_t const gap_;
size_t * const bin_;
size_t n_too_small_, n_too_large_;
};
Histogram::Histogram(ptrdiff_t m, size_t g, size_t n)
:minval_(m), maxval_(m + n*g - 1), gap_(g),
bin_(new size_t[n]), n_too_small_(0), n_too_large_(0)
{
assert(g != 0 && n != 0);
}
void Histogram::record(ptrdiff_t datapoint){
if (datapoint < minval_)
{
++n_too_small_;
}
else if (datapoint > maxval_)
{
++n_too_large_;
}
else
++bin_[(datapoint - minval_) / gap_];
}
void Histogram::output_to(std::ostream &output){
output << "< " << minval_ << ": " << n_too_small_ << '\n';
for (ptrdiff_t left = minval_; left < maxval_; left += gap_)
{
output << left << ".." << left + gap_ - 1 << ": "
<< bin_[(left - minval_) / gap_] << "\n";
output << "> " << maxval_ << ": " << n_too_large_ << '\n';
}
}
int main()
{
Histogram h = Histogram(1, 5, 10);
h.output_to(std::cout);
h.~Histogram();
return 0;
}
莫名的析构崩溃。
编译运行环境:Centos7 x64, gcc 6.1
[chaos@localhost cpp]$ ./10.5
< 1: 0
1..5: 0
> 50: 0
6..10: 0
> 50: 0
11..15: 0
> 50: 0
16..20: 0
> 50: 0
21..25: 0
> 50: 0
26..30: 0
> 50: 0
31..35: 0
> 50: 0
36..40: 0
> 50: 0
41..45: 0
> 50: 0
46..50: 0
> 50: 0
*** Error in `./10.5': double free or corruption (fasttop): 0x00000000020b8c20 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x7d023)[0x7f297e715023]
./10.5[0x400f35]
./10.5[0x400e93]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7f297e6b9b15]
./10.5[0x400a89]
======= Memory map: ========
00400000-00402000 r-xp 00000000 fd:00 3124212 /home/chaos/文档/proc/cpp/10.5
00601000-00602000 r--p 00001000 fd:00 3124212 /home/chaos/文档/proc/cpp/10.5
00602000-00603000 rw-p 00002000 fd:00 3124212 /home/chaos/文档/proc/cpp/10.5
020a7000-020d9000 rw-p 00000000 00:00 0 [heap]
7f2978000000-7f2978021000 rw-p 00000000 00:00 0
7f2978021000-7f297c000000 ---p 00000000 00:00 0
7f297e698000-7f297e84e000 r-xp 00000000 fd:00 134378031 /usr/lib64/libc-2.17.so
7f297e84e000-7f297ea4e000 ---p 001b6000 fd:00 134378031 /usr/lib64/libc-2.17.so
7f297ea4e000-7f297ea52000 r--p 001b6000 fd:00 134378031 /usr/lib64/libc-2.17.so
7f297ea52000-7f297ea54000 rw-p 001ba000 fd:00 134378031 /usr/lib64/libc-2.17.so
7f297ea54000-7f297ea59000 rw-p 00000000 00:00 0
7f297ea59000-7f297ea6e000 r-xp 00000000 fd:00 142624879 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f297ea6e000-7f297ec6d000 ---p 00015000 fd:00 142624879 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f297ec6d000-7f297ec6e000 r--p 00014000 fd:00 142624879 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f297ec6e000-7f297ec6f000 rw-p 00015000 fd:00 142624879 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f297ec6f000-7f297ed70000 r-xp 00000000 fd:00 134378041 /usr/lib64/libm-2.17.so
7f297ed70000-7f297ef6f000 ---p 00101000 fd:00 134378041 /usr/lib64/libm-2.17.so
7f297ef6f000-7f297ef70000 r--p 00100000 fd:00 134378041 /usr/lib64/libm-2.17.so
7f297ef70000-7f297ef71000 rw-p 00101000 fd:00 134378041 /usr/lib64/libm-2.17.so
7f297ef71000-7f297f0e2000 r-xp 00000000 fd:00 141313580 /usr/lib64/libstdc++.so.6.0.22
7f297f0e2000-7f297f2e2000 ---p 00171000 fd:00 141313580 /usr/lib64/libstdc++.so.6.0.22
7f297f2e2000-7f297f2ec000 r--p 00171000 fd:00 141313580 /usr/lib64/libstdc++.so.6.0.22
7f297f2ec000-7f297f2ee000 rw-p 0017b000 fd:00 141313580 /usr/lib64/libstdc++.so.6.0.22
7f297f2ee000-7f297f2f2000 rw-p 00000000 00:00 0
7f297f2f2000-7f297f313000 r-xp 00000000 fd:00 134294926 /usr/lib64/ld-2.17.so
7f297f4f9000-7f297f4fe000 rw-p 00000000 00:00 0
7f297f510000-7f297f513000 rw-p 00000000 00:00 0
7f297f513000-7f297f514000 r--p 00021000 fd:00 134294926 /usr/lib64/ld-2.17.so
7f297f514000-7f297f515000 rw-p 00022000 fd:00 134294926 /usr/lib64/ld-2.17.so
7f297f515000-7f297f516000 rw-p 00000000 00:00 0
7ffe2c645000-7ffe2c666000 rw-p 00000000 00:00 0 [stack]
7ffe2c744000-7ffe2c746000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
已放弃(吐核)
本文介绍了一个用C++实现的直方图记录器类,该类用于记录和统计数值分布情况。代码中实现了直方图的基本操作,如构造、记录数据点及输出结果。但在运行时出现析构函数崩溃的问题,疑似存在内存释放错误。
2552

被折叠的 条评论
为什么被折叠?



