《Effective C++中文版,第三版》读书笔记8

条款49:了解new-handler的行为

当operator new无法满足某一内存分配需求时,它常会抛出异常。以前会返回一个null,某些旧式的编译器目前也是这样。

#include 

void outOfMem()
{
    std::cout << "Out of range." << std::endl;
}

int main()
{
    std::set_new_handler(outOfMem);
    int *pBigDataArray = new int[10000000000L]; // 抛出bad_alloc
}

请记住:

​ set_new_handler允许客户指定一个函数,在内存分配无法满足时被调用。

​ Nothrow new 是一个颇为局限的工具,因为它只适用于内存分配;后继的构造函数调用还是可以抛异常。

条款50:了解new和delete的合理替换时机

请记住:

​ 有许多理由需写个自定义的new和delete,包括改善效能,对heap运用错误进行调试、收集heap使用信息。

条款51:编写new和delete时需固守常规

请记住:

​ operator new 应该内涵一个无穷循环,并在其中尝试分配内存,如果它无法满足内存需求,就应该调用new-hangder.它也应该由能力处理0bytes申请。class专属版本则还应该处理比正确大小更大(错误)申请。

​ operator delete应该在受到null指针时不做任何事情。Class专属版本则还应该处理“比正确大小更大(错误)申请”

条款52:写了placement new也要写placement delete

placement operator new:

如果operatornew接受的参数除了一定会有个的哪个size_t之外,还有其它,那么它便是placement new。

placement operator delelte:

如果operator delete 接受额外参数,便称为placement delete

请记住:

​ 当你写了一个placement operator new,请确定也写出对应的placement operator delete。如果没有那样做,你的程序可能会发生隐微而时断时续的内存泄漏。

​ 当你声明placement new和placement delete,请不要无意识(非故意)地遮掩了它们的正常版本。

#include 
#include 

// 如果你在class内部声明任何形式的news,它会遮掩其标准形式。除非你的意思是要阻止class的客户使用这些形式。
// 建立一个base class内涵所有正常形式的new和delete

class StandardNewDeleteForms
{
public:
    // normal new/delete
    static void *operator new(std::size_t size) throw(std::bad_alloc)
    {
        return ::operator new(size);
    }

    static void operator delete(void *pMemory) throw()
    {
        ::operator delete(pMemory);
    }

    // placement new/delete
    static void *operator new(std::size_t size, void *ptr) throw()
    {
        return ::operator new(size, ptr);
    }

    static void operator delete(void *pMemory, void *ptr) throw()
    {
        return ::operator delete(pMemory, ptr);
    }

    // nothrow new/delete
    static void *operator new(std::size_t size, const std::nothrow_t &nt) throw()
    {
        return ::operator new(size, nt);
    }

    static void operator delete(void *pMemory, const std::nothrow_t nt) throw()
    {
        return ::operator delete(pMemory);
    }
};

// 定义子类,继承基类
class Widget : public StandardNewDeleteForms
{
public:
    // 让子类的new/delete在子类中可见
    using StandardNewDeleteForms::operator new;
    using StandardNewDeleteForms::operator delete;

    // 自定义的placement new/delete 这俩成对出现,额外参数要相同。
    static void *operator new(std::size, std::ostream &logStream) throw(std::bad_alloc);
    static void operator delete(void *pMemory, std::ostream &logStream) throw();
};

条款53: 不要轻忽编译器的警告

警告信息天生和编译器相依,不同的编译器由不同的告警标准。

请记住:

​ 严肃对待编译器发去的警告信息。努力在你的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉

​ 不要过度依赖编译器的报警能力,因为不同的编译器对待事情的态度并不相同。

条款54:熟悉TR1在内的标准程序库

条款55:熟悉boost

最后这里两条就是再说,该看看boostl了。

你可能感兴趣的:(C/C++学习笔记,c++,开发语言,学习)