美文网首页
c++躺坑记录-1

c++躺坑记录-1

作者: 小跑001 | 来源:发表于2020-06-06 10:34 被阅读0次
  • lambda 临时变量
#include <functional>
#include <iostream>

typedef std::function<int(int, int)> TestFunc;

void Exec(TestFunc& f) {
    f(1, 2);
}

int main() {
    //auto g = [](int a, int b){std::cout << "hello" << a+b << std::endl;return a+b;};
    //Exec(g);
    Exec([](int a, int b){std::cout << "hello" << a+b << std::endl;return a+b;});
    return 0;
}

编译后报错: no matching function for call to 'Exec'
经查, 发现lamaba表达式如果用auto赋值的时候, 默认自动生成的的const变量, 意味着不可修改. 故不能传给非const引用, 只能传给const引用或者传值. (lamdba作为临时变量同理).

  • 动态库core
    so.h
#ifndef _SO_H_
#define _SO_H_

#include <iostream>
#include <map>

class A {
 public:
     A() {std::cout << "enter A at address:" << this << std::endl; m_[1]=2;}
     ~A() {std::cout << "leave A at address" << this << std::endl;}

 private:
    std::map<int, int> m_;
};


#endif // _SO_H_

so.cc

#include "so.h"

A a_test;

main.cc

#include "so.h"

A a_test;

int main() {
    return 0;
}

步骤:
1 运行 gcc -fPIC -shared -o libtest.so so.cc 生成动态库
2 运行g++ main.cc -L. -ltest
3 ./a.out

enter A at address:0x4091e0
enter A at address:0x4091e0
leave A at address0x4091e0
leave A at address0x4091e0
*** Error in `./a.out': double free or corruption (fasttop): 0x0000000001e05c50 **

结论:
由上可以看出, 假如程序里面和so库定义了同样的变量(例子里面是a_test), 这个变量会被覆盖, 由输出可以看出都是引用的同一个地址, 然而构造和析构的时候同一个地址会被调用两次, 导致有些资源在第二次释放的时候core掉.
解决方案有多种, 可以把动态库改成静态库, 或者指定编译选项禁止去覆盖, 或者在开发者写代码的时候注意不要定义同样名字的变量.

相关文章

  • c++躺坑记录-1

    lambda 临时变量 编译后报错: no matching function for call to 'Exec...

  • win7环境下安装scrapy报错解决办法

    前言: 遇到的小坑,记录一下 win7环境下安装scrapy会有报错 Microsoft Visual C++ 1...

  • Flutter加载图片躺坑记录

    加载本地图片步骤 1、在根目录下建立文件夹,也可以建在其它目录下,官方建议命名为images 2.在pubspec...

  • C++踩坑记录D1

    C++与C语言有一个显著的不同点,就是输入输出语句。 第一行的if语句用一个大括号把它括起来,整个语句才能够执行,...

  • 躺坑

    通过躺坑去学习,积累未知的知识,凡事多想想。

  • flutter_steps_counter躺坑记录

  • Flutter入门——Windows下的安装与环境配置(二)

    前言:作为一只刚刚躺完坑的猿、以简书的方式记录这配置的大型入坑现场。 flutter 特点:跨平台,高质量,热更新...

  • GO 调用 DLL 类库

    最近一个项目需要用到Go调用C++的DLL类库 这里记录一下坑 DLL 原型 GO调用DLL 执行结果 坑 一开始...

  • Flutter加载本地图片躺坑记录

    步骤 1.在根目录建立一个文件夹,名称建议叫images2.在此文件夹下建立两个文件夹,一个为2.0x,一个为3....

  • 踩坑记录1

    从小到大,我算是一个写代码很自信的人。然而事实却是,无论多么幼稚的错误,曾经犯过一次,以后还是可能再犯;无论当时多...

网友评论

      本文标题:c++躺坑记录-1

      本文链接:https://www.haomeiwen.com/subject/fmuttktx.html