我正在尝试memcheck我写的C python扩展,但是我在设置valgrind以使用python时遇到了麻烦.我真的很感激一些建议.仅供上下文使用,这是Ubuntu 13.10,python 2.7.5+和valgrind 3.8.1.
根据Readme.valgrind我的建议,我做了以下.
1)用.下载python源码
sudo apt-get build-dep python2.7
apt-get source python2.7
Run Code Online (Sandbox Code Playgroud)
2)应用代码补丁,即"在Objects/obmalloc.c中取消注释Py_USING_MEMORY_DEBUGGER".
3)应用抑制补丁,即"取消注释Misc/valgrind-python.supp中的行,以抑制PyObject_Free和PyObject_Realloc的警告"
4)编译python与
./configure --prefix=/home/dejan/workspace/python --without-pymalloc
make -j4 install
Run Code Online (Sandbox Code Playgroud)
请注意,我做了2和3,而README.valgrind说做2或3 ...更多不能伤害.
现在,让我们在一些示例python代码中对此进行测试 test.py
print "Test"
Run Code Online (Sandbox Code Playgroud)
让我们用这个脚本在python上运行valgrind
valgrind --tool=memcheck --leak-check=full --suppressions=python2.7-2.7.5/Misc/valgrind-python.supp bin/python test.py
Run Code Online (Sandbox Code Playgroud)
出乎意料的是,仍然有来自valgrind的大量报告,其中第一个报告(以及更多关注报告)
==27944== HEAP SUMMARY:
==27944== in use at exit: 857,932 bytes in 5,144 blocks
==27944== total heap usage: 22,766 allocs, 17,622 frees, 4,276,934 bytes allocated
==27944==
==27944== 38 bytes in 1 blocks are possibly lost in loss record 24 of 1,343
==27944== …Run Code Online (Sandbox Code Playgroud) 假设我有一个对象向量,其中:
对于引用大数据的对象来说,这似乎很标准 - 例如向量向量.
问题:有没有办法使用std::sort标准库中的某个或其他排序例程对此向量进行排序,以便不进行复制,而是使用交换?我正在寻找一个预c++0x解决方案(没有移动语义).
重载std::swap似乎是第一次自然尝试,它确实有点帮助,但它只消除了一小部分复制.
注意:gcc行为的示例
为了排序100 81 64 49 36 25 16 9 4 1 0 1 4 9 16 25 36 49 64 81,我的gcc std :: sort调用19个拷贝构造函数,92个赋值和6个交换.
由于可用问题需要大量技巧和预处理技术与决策程序无直接关系,因此很多时候对SMT求解器进行新的研究.这些通常是未发表的或需要时间来适当地实施和优化,此外使得对不同解算器的比较和理解非常困难.
是否可以使用Z3作为预处理器来解决问题并将其转储为预处理形式(z3本身用来解决问题)?
我没有看到任何命令行选项,但我猜测可能有一些方法可以实现这一点,通过策略,通过python接口,甚至编写一些额外的代码.
说我声明一个模板类A中a.h
#include <iostream>
template<bool b>
class A {
public:
void print(std::ostream& out);
};
Run Code Online (Sandbox Code Playgroud)
并确定在打印方法a.cpp(与明确的instatiation true和false)
#include "a.h"
template<bool b>
void A<b>::print(std::ostream& out) {
out << "A" << b;
}
template class A<true>;
template class A<false>;
Run Code Online (Sandbox Code Playgroud)
main.cpp可以是一个主要的主要程序示例
#include "a.h"
int main() {
A<true> a;
a.print(std::cout);
}
Run Code Online (Sandbox Code Playgroud)
上面的小项目编译得很好.
问题:如果我将显式实例化放在print方法(in a.cpp)的定义之上,则代码不再编译,并且通常会undefined reference to A<true>::print(...)出现错误.
#include "a.h"
template class A<true>;
template class A<false>;
template<bool b>
void A<b>::print(std::ostream& out) { …Run Code Online (Sandbox Code Playgroud) 考虑以下C程序
#include <stdio.h>
typedef struct s {
int x;
} s_t;
int main() {
int x;
s_t a;
scanf("%d", &x);
if (x > 0) {
s_t a;
a.x = x;
}
printf("%d\n", a.x);
}
Run Code Online (Sandbox Code Playgroud)
将a在If分支结构变量明确阴影的a主结构体变量.可以预期printf中的输出将是未定义的,但是对于GCC,范围变量似乎等于主变量.
例如
gcc test.c -o test
echo 10 | ./test
Run Code Online (Sandbox Code Playgroud)
将输出10.
另一方面,通过clang执行此操作,正如预期的那样
clang test.c -o test
echo 10 | ./test
Run Code Online (Sandbox Code Playgroud)
输出-2145248048.
这是一个GCC错误还是存在某种未触发的行为?
gcc 4.8.2 clang 3.4