C++程序设计语言练习10.5 直方图的C++表示

本文介绍了一个用C++实现的直方图记录器类,该类用于记录和统计数值分布情况。代码中实现了直方图的基本操作,如构造、记录数据点及输出结果。但在运行时出现析构函数崩溃的问题,疑似存在内存释放错误。

答案上的代码如下:


#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]
已放弃(吐核)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值