我尝试使用ubuntu 15.10存储库版本的libmuparser(包libmuparser2v5).用gcc编译工作正常,但不能用clang编译.我深入研究了这个问题,提出了以下最小(非)工作示例和几个问题.
考虑一个带有一个简单类的库,它接受一个string并返回一个string.
testlib.h:
#pragma once
#include <string>
struct Test {
std::string str;
void set(std::string s);
std::string get();
};
Run Code Online (Sandbox Code Playgroud)
testlib.cpp:
#include "testlib.h"
void Test::set(std::string s) {
str = s;
}
std::string Test::get() {
return str;
}
Run Code Online (Sandbox Code Playgroud)
这是用gcc 5.2.1编译为静态库的
g++ -Wall -c testlib.cpp -o testlib-gcc.o
ar rcs libtest-gcc.a testlib-gcc.o
Run Code Online (Sandbox Code Playgroud)
现在编译一个应用程序 main.cpp
#include <iostream>
#include "testlib.h"
int main()
{
Test p;
p.set("Hello!");
std::cout << p.get() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
用clang 3.6.2-1使用
clang++ main.cpp -o out-clang …Run Code Online (Sandbox Code Playgroud) 我发现了一种情况,其中向量的行为类似于泄漏内存,并且可以将其归结为最小的工作示例.在这个例子中,我(在一个函数中)生成一个包含三个char向量的向量.首先,这些char矢量被推入大量元素,它们的容量缩小到它们的大小.然后在大矢量上分配单元素大小的矢量.现在的问题是,使用的内存太大,即使函数返回并且向量被破坏,内存也不会被释放.我如何获得回忆?为什么它显示这个bahaviour?我该怎么做才能避免这种泄漏行为?
这里是示例代码(抱歉长度):
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
using namespace std;
// see http://man7.org/linux/man-pages/man5/proc.5.html at /proc/[pid]/status
string meminfo() {
// memory information is in lines 11 - 20 of /proc/self/status
ifstream stat_stream("/proc/self/status",ios_base::in);
// get VmSize from line 12
string s;
for ( int linenum = 0; linenum < 12; ++linenum )
getline(stat_stream,s);
stat_stream.close();
return s;
}
void f() {
vector<vector<char>> mem(3); // with 1,2 memory is fine
size_t size = 16777215; // with 16777216 or greater …Run Code Online (Sandbox Code Playgroud)