C++ 智能指针的简单实现 1 std::auto_ptr C++ 中经常会出现因为没有 delete 指针而造成的内存泄漏,例如有一个 Object 模板类:
template<typename T> class Object { public: // constructor Object() : t_() { cout << "Object::Constructor " << this << endl; } Object(T t) : t_(t) { cout << "Object::Constructor " << this << endl; } // copy-ctor Object(const Object &other) { cout << "Object::Copy-ctor " << this << endl; } // destructor ~Object() { cout << "Object::Destructor " << this << endl; } void Set(T t) { t_ = t; } void Print() { cout << t_ << endl; } private: T t_; }; 如果在堆上为类对象分配了内存,在离开其作用域的时候又没将其释放,则会造成内存泄漏:...
C++ 闭包和匿名函数 本文主要介绍了 C++ 中闭包和仿函数,以及匿名函数相关的概念。
1 闭包和仿函数 闭包(Closure)可以被理解为一个附带数据的操作,WikiPedia 对闭包的定义是 “In programming languages, a closure, also lexical closure or function closure, is a technique for implementing lexically scoped name binding in a language with first-class functions.",其中有两层含义:
词法作用域(lexically scoped)的名字绑定(name binding):在词法作用域(C++ 的词法作用域是静态绑定的,包括块、函数、类、命名空间、全局作用域等)中,变量名与其词法上下文的标识符相关联,而独立于运行时的调用栈; 函数被当作头等公民(first-class citizen):在运行时可以构造一个函数对象并将其作为参数传递给其他函数; 显然 C++ 98 并不符合这两点定义,因此 C++ 98 中并没有严格意义上的闭包,但我们可以用仿函数(Functor)来模拟闭包的行为;仿函数即一个重载了小括号操作符的类,这个类拥有与函数相近的行为方式,它拥有自己的私有成员变量,例如:
class Adder { public: int operator()(int num) { sum += num; return sum; } Adder() : sum(0) {} Adder(int num) : sum(num) {} private: int sum; }; int main() { Adder adder(0); cout << adder(1) << endl; cout << adder(2) << endl; cout << adder(3) << endl; } $ g++ -std=c++98 -o adder adder....