#include <iostream>
#include <vector>
using namespace std;
class A {
private:
static int id_;
int id;
int * buffer;
public:
A(int id) {
this->id = id;
cout << this->id << " construct!" << endl;
buffer = new int[10];
A(const A & a){
this->id = a.id;
this->buffer = a.buffer;
cout << this->id << "copy construct!" << endl;
int get_id(){
return this->id;
~A() {
delete [] buffer;
cout << id << " deconstruct!" << endl;
int A::id_ = 0;
int main() {
vector<A> v;
v.reserve(10);
v.emplace_back(10);
v.emplace_back(15);
v.emplace_back(20);
cout << v[0].get_id() << ' ' << v[0].get_id() << endl;
return 0;
上述代码中的emplace_back相当于调用了A的带参构造函数(参数为id),这样避免了拷贝构造的发生。但同时我们要提防vector。由于vector是动态size,我们必须先reserve一定大小的空间,否则当vector 占用空间达到其capacity,就会发生拷贝构造,导致前述问题。 如何解决,欢迎讨论。
1. 介绍我们先从一段平常的代码说起int main() { auto * p = new int [10]; delete [] p; return 0;}申请一段空间,并释放,没有任何问题。再看下面的代码int main() { auto * p = new int [10]; delete [] p; delete [] p; return 0;}这样就会出问题,这是一个runtime error,成为双释放(double f
私有构造函数
私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。例如:
class NLog
// Private Constructor:
private NLog() { }
public static double e = Math.E; //2.71828...
声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。但是,通常显式地使用 private 修饰符来清楚地表明该类不能被实例化。
CTP开发中,如果把Trade,Market的so放在一起开发,如果不做处理,会遇到double free or corruption(!prev)的错误,基本如下:
*** glibc detected *** ./bin/quant_ctp_XTrader_no_debug_2017-03-16_15-36-20: double free or corruption (!prev): 0x0000000001d71120 ***
======= Backtrace: =========
/lib64/libc.so.6[0x32b4a75f3e]
/lib64/libc.so.6[0x32b4a78dd0]
/usr/lib64/libthosttraderapi.so(+0x184612)[0x7f3d1e503612]
/lib64/libc.so.6(__cxa_finalize+0x9d)[0x32b4a35e7d]
/usr/lib64/libthosttraderapi.so(+0x104b46)[0x7f3d1e483b46]
开发中我也遇到该问题,后辛苦找到解决办法。方案附送在该附件里,仅供参考。
仅供参考!仅供参考!仅供参考!
重要的事情说三遍!
使用此代码引起的任何损失,笔者不承担任何责任。
std::vector源码分析vector容器概述一、vector对比array容器二、底层技术实现1.空间的动态扩展2.迭代器相关三、源码摘要
vector容器概述
// highlighted block
1. 模板类vector类似于string类,也是一种动态数组。
2. 它可以在运行阶段的设置vector对象的长度,可在末尾附加新数据,还可以在中间插入新数据。
3. 它是使用new创建动态数组的替代品。
实际上vector类确实使用new和delete来管理内存,但这种工作是自动完成的。
先说一下浅拷贝和深拷贝:
C++中默认构造函数主要有两类,
第一类是针对定义类对象的,定义类对象时,如果没有对应的构造函数,会默认调用一个函数体为空的无参构造函数,比较简单,本文不多赘述;
第二类是针对类对象初始化新类对象的,当用类对象初始化新的类对象时,如果没有对应的拷贝构造函数,会调用一个默认的拷贝构
为了解决函数不能重名的问题,就好比有两本一模一样的书,为了区分书是谁的在上面分别写上了不同的名字,而这个名字就是命名空间。
而c++中的输入是用流的方式实现的
键盘—>”hello”—>cin(输入流)—> >>(提取)—>变量—> <<(插入) —> cout(输出流)—>屏幕
while(cin >&g...
设计一个Ear类,描述狗的耳朵,包含属性color(int型)。再设计一个Dog类,包含两个Ear成员,leftEar和rightEar,并包含狗的体重weight(double型)和年龄age(int型)。 编写Ear类和Dog类的构造函数、拷贝构造函数和析构函数以及其它必要的函数。在构造函数、拷贝构造函数和析构函数中输出“调用XX类的XX函数”。 测试上述类。
int age;
public:
Dog(int lc, int rc, double w, int a) : leftEar(lc), rightEar(rc), weight(w), age(a) {
cout << "调用Dog类的构造函数" << endl;
Dog(const Dog& d) : leftEar(d.leftEar), rightEar(d.rightEar), weight(d.weight), age(d.age) {
cout << "调用Dog类的拷贝构造函数" << endl;
~Dog() {
cout << "调用Dog类的析构函数" << endl;
测试代码如下:
```c++
int main() {
Ear e1(1);
Ear e2(e1);
Dog d1(2, 3, 10.5, 3);
Dog d2(d1);
return 0;
输出结果如下:
调用Ear类的构造函数
调用Ear类的拷贝构造函数
调用Ear类的构造函数
调用Ear类的构造函数
调用Dog类的构造函数
调用Ear类的拷贝构造函数
调用Ear类的拷贝构造函数
调用Dog类的拷贝构造函数
调用Dog类的析构函数
调用Ear类的析构函数
调用Ear类的析构函数
调用Dog类的析构函数
调用Ear类的析构函数
调用Ear类的析构函数
可以看到,构造函数、拷贝构造函数和析构函数都被正确地调用了。