怕什么真理无穷,进一寸有一寸的欢喜。——读《胡适谈读书》
add_executable ( random_complex
src/random_complex_generator.cpp )
为什么random_complex不是random_complex_generator
这里的可执行文件的名称可以自由定义。但是,有几个通常的最佳实践可供参考:
通常我们会为可执行文件选择一个具有描述性的名称,这样的话其他人或者你自己在将来回看代码的时候,可以更好地理解该执行文件的功能。
如果一个程序的源代码文件不止一个,那么尽量用一个总体的名称来命名可执行文件,而不是使用单个源文件的名字。
避免使用系统已有命令或者常用单词作为可执行文件的名字,因为这可能会导致命令行调用时的混淆。
规避特殊字符和空格,这些可能导致在命令行环境中引发问题。
random_complex是一个很好的名称,因为它既表明了这个程序的主要功能(生成复杂的随机数),又足够简短,便于在命令行中快速输入。
析构函数需要定义内容吗
析构函数是一个特殊的成员函数,它在一个对象即将被销毁时被自动调用。它的主要任务是释放对象持有的任何资源,例如动态分配的内存、打开的文件、获取的锁等。
在许多情况下,你可以不用定义析构函数。例如,如果你的类不分配任何动态资源,那么编译器提供的默认析构函数应该足够了。默认析构函数只完成最基础的工作,如使对象逐个突变并调用每个成员的析构函数。
然而,当你开始处理自己管理的资源时(如动态分配内存,打开文件等),你就需要定义一个析构函数来正确释放这些资源。
需要注意的是,当类包含智能指针如shared_ptr,unique_ptr之类的成员变量时,析构函数一般不需要做任何事。智能指针的定义是当它们销毁时自动删除它们指向的对象,除非你需要在类销毁前采取一些特殊行动(如通知其他对象,关闭网络连接等),否则你不需要定义析构函数内容。
总的来说,需要在析构函数中定义内容取决于你的类是否持有必须在类析构时释放或清理的资源。
析构函数一般什么时候被调用
析构函数在对象销毁时被自动调用,具体时机取决于对象的生命周期。下面是几种常见的情况:
对于局部对象:当控制流程离开对象被创建的语句块时,析构函数将被调用。也就是说,析构函数在包含对象的函数或语句块结束时被调用。
对于静态局部对象:当程序退出时,析构函数被调用。
对于动态分配的对象:当使用 delete 操作符时,析构函数被调用。
对于类的成员对象:当包含对象的类的析构函数调用时,会调用成员对象的析构函数。
对于全局对象:当程序退出时,析构函数被调用。
对于临时对象:在生成临时对象的完整表达式结束后,析构函数被调用。
值得注意的是,如果一个对象是基类的派生类对象,基类的析构函数会在派生类的析构函数执行完毕后被调用。由于析构函数的这种特性,所以在设计带有资源管理功能的基类时,必须将基类的析构函数声明为虚函数,以避免只调用基类的析构函数而导致资源未能正确释放的问题。
析构函数是一个特殊的成员函数,它在一个对象即将被销毁时被自动调用。它的主要任务是释放对象持有的任何资源,例如动态分配的内存、打开的文件、获取的锁等。
在许多情况下,你可以不用定义析构函数。例如,如果你的类不分配任何动态资源,那么编译器提供的默认析构函数应该足够了。默认析构函数只完成最基础的工作,如使对象逐个突变并调用每个成员的析构函数。
然而,当你开始处理自己管理的资源时(如动态分配内存,打开文件等),你就需要定义一个析构函数来正确释放这些资源。
需要注意的是,当类包含智能指针如shared_ptr,unique_ptr之类的成员变量时,析构函数一般不需要做任何事。智能指针的定义是当它们销毁时自动删除它们指向的对象,除非你需要在类销毁前采取一些特殊行动(如通知其他对象,关闭网络连接等),否则你不需要定义析构函数内容。
总的来说,需要在析构函数中定义内容取决于你的类是否持有必须在类析构时释放或清理的资源。
env::OccMap::Ptr env_ptr_;// typedef shared_ptr<OccMap> Ptr;
这句代码解释一下
这个代码行定义了一个名为 env_ptr_ 的 shared_ptr(智能指针),指向OccMap 类型的对象。shared_ptr 是 C++ 中用于实现动态内存管理的一个工具,属于智能指针的一种。
在这里,OccMap::Ptr 是 std::shared_ptr<OccMap> 的一个别名,也就是说它创建了一个指向 OccMap 类型的共享指针。shared_ptr 的目标是允许多个指针指向同一对象。shared_ptr 使用引用计数,即它维护了一个记录它被引用了多少次的计数器。一旦引用计数器的值变为 0(也就是说没有任何对象引用它),那么它就会自动销毁。
在你的代码中,env_ptr_ 指向一个 OccMap 类型对象的共享指针被创建,但是它并没有被初始化来指向一个实际的对象。在你尝试解引用该指针之前,你需要确保它被赋值给一个实际的 OccMap 对象。
希望上述解释能够帮助您理解这行代码的含义。如果需要针对此主题的进一步解释或有其他问题,欢迎随时进行询问。
env::OccMap::Ptr env_ptr_;
这行代码创建了一个类型为OccMap的共享智能指针shared_ptr,名为env_ptr_。
首先让我们理解OccMap::Ptr,它是一种类型定义(Type Definition),也就是给一种数据类型起一个新的名字。在这种情况下,Ptr应该是在OccMap类中定义的,表示一个指向OccMap对象的智能指针shared_ptr。shared_ptr是一种在C++中常见的智能指针,它可以确保在任何时候只有一个指针指向一个特定的对象,来避免内存泄露。
在这里,env_ptr_是该类型的一个实例。该指针尚未初始化,即它不指向任何内容。在使用该指针之前,必须先使它指向一个OccMap的实例。
这个指针用处很多,如可以用在需要改变或传递OccMap对象但不希望进行整个对象的复制的场景中。
所以我可以理解我env_ptr_是一个shared_ptr智能指针,直系那个了OccMap类型吗
是的,你完全正确。在这段代码中,env::OccMap::Ptr 是一个类型别名,表示一个指向 OccMap 对象的 shared_ptr(共享指针)。env_ptr_ 是该类型的一个实例。
所以,env_ptr_ 是一个指向 OccMap对象的智能指针。这意味着 env_ptr_ 可以用于访问、修改指向的 OccMap 对象,同时也自动处理了对象的生命周期管理,你不需要手动地释放对象占用的内存。当没有任何 shared_ptr 指向某个对象时,该对象将被自动删除。