`

引用已经析构了的局部变量

阅读更多

在平常的编程里面,这样的代码算是再普通不过了:

void func()
{
    SomeType local_obj;
    another_func(local_obj);
    // ...
}

然而最近我却遇到了问题。在使用 boost::asio 的时候,使用了这种常规的做法。结果遭遇段错误。后来才意识到是在进行异步调用。 another_func 拿着 local_obj (事实上,真正的代码是一个 local 的容器,我把它的 iterator 传递到了一个异步调用里面)却在 func 返回的时候就已经被析构了。不过,在异步调用里面也可以很容易地自动管理对象的生存期,很常用的方法就是使用 boost::shared_ptr 了,在 asio 的例子里面也随处可见。

现在刚刚开始接触异步调用、多线程编程方面的东西,很多东西还不熟悉,需要多多实践啊。

分享到:
评论

相关推荐

    C++全局变量初始化的一点总结

    C++中的全局变量初始化是一个重要的话题,涉及到程序的正确性和可预测性。全局变量,即具有静态存储期...程序员应当尽可能减少全局变量的使用,转向局部变量、静态局部变量或智能指针等更安全的选择,以提高代码质量。

    cC++面试题金山的等等

    4. **作用域与生命周期**:在面试题中提到,局部变量可以与全局变量同名,但函数内部优先使用局部变量。全局变量在整个程序中可见,而局部变量只在其定义的代码块内有效。此外,局部变量在函数执行结束后生命周期...

    程序员大厂面试华为篇.pdf

    全局变量的生命周期贯穿整个程序,而局部变量的生命周期只在当前函数的执行过程中。 2.1.4 什么是平衡二叉树? 平衡二叉树是一种特殊的二叉树,它的每个节点的左子树和右子树的高度差不超过 1。平衡二叉树可以保证...

    私人珍藏82道linux下c-c++语法知识点归纳和总结.docx

    但需要注意,不要返回局部变量或动态分配内存的引用,以免造成悬挂引用。 7. **常引用**: 常引用(`const reference`)用于声明不会修改实参的引用,常用于只读操作或防止函数内部修改参数。 8. **引用作为...

    进程退出、dll卸载、静态成员析构的Crash

    进程退出时(调用了 return 0; 之后CRT析构了全局对象,然后调用ExitProcess...ExitProcess的时候,系统会强制回收一些new出来的堆区空间,如果这之后dll中的静态变量还会 引用到这些空间,则会出现内存不可读的错误。

    面试题题库,经典知识点

    13. 局部变量能否和全局变量重名:可以重名,但它们的作用域不同,在函数内部的局部变量会遮蔽同名的全局变量。 14. 引用一个已经定义过的全局变量:在其他文件中通过extern关键字来引用已定义的全局变量。 15. ...

    编程基础知识——3011

    main函数执行前,C++程序会执行静态初始化,包括全局变量和静态局部变量的初始化。内存分配有栈、堆、静态存储区和常量区四种方式,它们各自有不同的作用域和生命周期。 const关键字提供了一种常量声明方式,相比#...

    深入理解c#t语言的特性

    域变量在类或对象中定义,有默认初始值,而局部变量在函数内定义,没有默认初始值。参数传递时,C#采用按值传递,对于值类型,传递的是变量的副本,而对于引用类型,传递的是对象引用的副本。这导致了值类型参数的...

    30道 C++ 常见面试题

    - **局部变量**:仅在声明它的作用域内可见,生命周期随作用域的结束而结束。 #### 13. C++是否类型安全? - C++在大部分情况下是类型安全的,但程序员需要小心处理指针和类型转换。 #### 14. main 函数执行前会...

    C++面经整理发布版.pdf

    如果需要修改函数内局部变量的内存,或者函数需要返回局部变量的内存,则应使用指针。在函数内使用指针前,需要确保分配内存,并在使用完毕后释放,否则会导致内存泄漏。而使用引用传递,则不需要创建临时变量,开销...

    腾讯校园招聘笔试题技术类 (5).pdf

    - 堆栈溢出通常发生在分配给栈的内存不足以存储所有局部变量和函数调用信息时。过度递归、大数组作为局部变量等可能导致此问题。 7. **不能声明为虚函数的函数** - 构造函数和析构函数不能声明为虚函数,因为它们...

    c++其他常见问题1

    - 注意事项:避免返回局部变量的引用,因为它们在函数结束后生命周期结束,导致悬挂引用。 10. **STL(Standard Template Library)**: - `std::vector`:动态数组,增减元素可能导致内存重新分配。 - 排序算法...

    16个常用的c++面试题.docx

    - 隐藏作用:static关键字用于局部变量时,使其在函数内部保持其状态,即使函数结束,变量的值也会保留,下次调用时仍可访问。 - 持久化:全局静态变量只被初始化一次,在程序开始时,且只在静态存储区分配空间,...

    C++调试技巧

    监视窗口允许你观察指定变量的值,局部变量窗口则显示当前作用域内的变量值,调用堆栈窗口则展示了函数调用的顺序,这对于追踪错误来源非常有帮助。 以一个简单的例子来说明调试过程,比如一个程序在运行时出现错误...

    C++_作业_5_答案2

    题目中,全局变量`a`和局部变量`b`在程序执行期间都会被构造,但只有局部变量`b`会在退出`main`函数时析构。因此,正确答案是C,即`b`析构了但是`a`没析构。 3. 函数指针与引用:对于函数指针定义`const char *&g( ...

    专升本面向对象程序设计_试卷_答案.doc

    题目中提到析构全局对象但不析构局部对象,这是因为局部对象在退出作用域时自动析构,而全局对象在程序结束时析构。 2. 函数重载:C++允许同一作用域内有多个同名函数,只要它们的参数列表不同即可,这称为函数重载...

    c++求职知识点总结.docx

    它可以用来修饰全局变量和局部变量,以及类的成员。当`static`用于全局变量时,它可以限制变量的作用域,使其只在当前源文件内可见,避免命名冲突。对于未初始化的全局静态变量和局部静态变量,它们会被自动初始化为...

    2013扬讯研发笔试题

    - `this`指针在构造函数和析构函数中用来引用当前正在构造或析构的对象,可以用来访问对象的成员变量。 8. **virtual关键字**: - `virtual`关键字用于声明虚函数,使得在多态调用时能根据实际对象类型动态绑定到...

    C++实验三.docx

    构造函数在对象创建时自动调用,而析构函数在对象生命周期结束(如局部变量离开作用域或动态分配的对象被`delete`)时自动调用。理解这一执行顺序对于内存管理和避免资源泄漏至关重要。 6. **常量对象和成员**: ...

Global site tag (gtag.js) - Google Analytics