- 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掉.
解决方案有多种, 可以把动态库改成静态库, 或者指定编译选项禁止去覆盖, 或者在开发者写代码的时候注意不要定义同样名字的变量.
网友评论