- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 A 类和一个派生自 A 的 B 类:
class A
{
public :
A() { // Some code }
virtual ~A(){}
// etc
};
这是我的 B 类:
class B : public A
{
public :
B():A(){//Some extra code}
~B();
// etc
};
A 和 B 的真实代码很长所以我不会把它贴在那里,除非有必要。
我的问题是,在我的主程序中:
只有当我有 B 的实例时才会出现段错误。
因此,为了找到我的问题所在,我尝试使用 Valgrind,但我被卡住了,因为我不明白 Valgrind 显示的是什么。
Valgrind 的输出很长,但里面有一个方案,结果如下:
==13512== Invalid read of size 4
==13512== at 0x852EE9D: __tcf_0 (in /usr/local/lib/libeikeotools.so)
==13512== by 0x6AE15E9: __cxa_finalize (cxa_finalize.c:56)
==13512== by 0x84C3E72: ??? (in /usr/local/lib/libeikeotools.so)
==13512== by 0x4010739: _dl_fini (dl-fini.c:252)
==13512== by 0x6AE1258: __run_exit_handlers (exit.c:82)
==13512== by 0x6AE12A4: exit (exit.c:104)
==13512== by 0x6AC6ECB: (below main) (libc-start.c:321)
==13512== Address 0x131e4d00 is 16 bytes inside a block of size 32 free'd
==13512== at 0x4C2C2BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13512== by 0x664536E: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==13512== by 0x73A3384: __tcf_0 (logwriter.cpp:32)
==13512== by 0x6AE15E9: __cxa_finalize (cxa_finalize.c:56)
==13512== by 0x7301A72: ??? (in /usr/local/lib/libeikeotoolsd.so)
==13512== by 0x4010739: _dl_fini (dl-fini.c:252)
==13512== by 0x6AE1258: __run_exit_handlers (exit.c:82)
==13512== by 0x6AE12A4: exit (exit.c:104)
==13512== by 0x6AC6ECB: (below main) (libc-start.c:321)
==13512==
==13512== Invalid free() / delete / delete[] / realloc()
==13512== at 0x4C2C2BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13512== by 0x852EEB3: __tcf_0 (in /usr/local/lib/libeikeotools.so)
==13512== by 0x6AE15E9: __cxa_finalize (cxa_finalize.c:56)
==13512== by 0x84C3E72: ??? (in /usr/local/lib/libeikeotools.so)
==13512== by 0x4010739: _dl_fini (dl-fini.c:252)
==13512== by 0x6AE1258: __run_exit_handlers (exit.c:82)
==13512== by 0x6AE12A4: exit (exit.c:104)
==13512== by 0x6AC6ECB: (below main) (libc-start.c:321)
==13512== Address 0x131e4cf0 is 0 bytes inside a block of size 32 free'd
==13512== at 0x4C2C2BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13512== by 0x664536E: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
==13512== by 0x73A3384: __tcf_0 (logwriter.cpp:32)
==13512== by 0x6AE15E9: __cxa_finalize (cxa_finalize.c:56)
==13512== by 0x7301A72: ??? (in /usr/local/lib/libeikeotoolsd.so)
==13512== by 0x4010739: _dl_fini (dl-fini.c:252)
==13512== by 0x6AE1258: __run_exit_handlers (exit.c:82)
==13512== by 0x6AE12A4: exit (exit.c:104)
==13512== by 0x6AC6ECB: (below main) (libc-start.c:321)
编辑 1:这是我的“B”类:
HOGpython.hpp :
#ifndef HOGPYTHON_H
#define HOGPYTHON_H
#include "osell/cvaddenda/HOGDescriptor2.h"
#include <opencv2/core/core.hpp>
#include "conversion.hpp"
#define NO_IMPORT_ARRAY
class HOGpython : public eikeotools::CvAddenda::HOGDescriptor2
{
public:
// Constructeurs :
HOGpython();
HOGpython(PyObject* _winSize, PyObject* _blockSize, PyObject* _blockStride, PyObject* _cellSize, int _nbins, double _winSigma);
// Destructeur :
~HOGpython(){ std::cout << " Destroying .." << std::endl;}
// setters :
PyObject* get_winSize() const;
PyObject* get_blockSize() const;
PyObject* get_blockStride() const;
PyObject* get_cellSize() const;
int get_nbins() const;
int get_derivAperture() const;
double get_winSigma() const;
int get_histogramNormType() const;
double get_L2HysThreshold() const;
bool get_gammaCorrection() const;
int get_nlevels() const;
// Setters :
void set_winSize( PyObject* o);
void set_blockSize( PyObject* o);
void set_blockStride( PyObject* o);
void set_cellSize( PyObject* o);
void set_nbins( int o);
void set_derivAperture( int o);
void set_winSigma( double o);
void set_histogramNormType( int o);
void set_L2HysThreshold( double o);
void set_gammaCorrection( bool o);
void set_nlevels( int o);
// Méthodes d'instance :
PyObject* compute(PyObject* img, PyObject* locations);
PyObject* computeSubPix(PyObject* img, PyObject* locations);
PyObject* computeGradient(PyObject* img);
};
#endif
和 HOGpython.cpp :
#include "HOGpython.hpp"
// == Constructeur sans paramètres == //
HOGpython :: HOGpython():eikeotools::CvAddenda::HOGDescriptor2()
{}
// == Constructeur avec paramètres == //
HOGpython :: HOGpython(PyObject* _winSize, PyObject* _blockSize, PyObject* _blockStride, PyObject* _cellSize, int _nbins, double _winSigma)
:eikeotools::CvAddenda::HOGDescriptor2( tupleToSize(_winSize),
tupleToSize(_blockSize),
tupleToSize(_blockStride),
tupleToSize(_cellSize),
_nbins,
1,
_winSigma,
eikeotools::CvAddenda::HOGDescriptor2::L2Hys,
0.2,
false,
eikeotools::CvAddenda::HOGDescriptor2::DEFAULT_NLEVELS)
{}
// == Getters == //
PyObject* HOGpython::get_winSize() const {return SizeToTuple(winSize); }
PyObject* HOGpython::get_blockSize() const {return SizeToTuple(blockSize); }
PyObject* HOGpython::get_blockStride() const {return SizeToTuple(blockStride); }
PyObject* HOGpython::get_cellSize() const {return SizeToTuple(cellSize); }
int HOGpython::get_nbins() const {return nbins; }
int HOGpython::get_derivAperture() const {return derivAperture; }
double HOGpython::get_winSigma() const {return winSigma; }
int HOGpython::get_histogramNormType() const {return histogramNormType; }
double HOGpython::get_L2HysThreshold() const {return L2HysThreshold; }
bool HOGpython::get_gammaCorrection() const {return gammaCorrection; }
int HOGpython::get_nlevels() const {return nlevels; }
// == Setters == //
void HOGpython::set_winSize(PyObject* o) {winSize = tupleToSize(o);}
void HOGpython::set_blockSize(PyObject* o) {blockSize = tupleToSize(o);}
void HOGpython::set_blockStride(PyObject* o) {blockStride = tupleToSize(o);}
void HOGpython::set_cellSize(PyObject* o) {cellSize = tupleToSize(o);}
void HOGpython::set_nbins(int o) {nbins = o; return;}
void HOGpython::set_derivAperture(int o) {derivAperture = o; return;}
void HOGpython::set_winSigma(double o) {winSigma = o; return;}
void HOGpython::set_histogramNormType(int o) {histogramNormType = o; return;}
void HOGpython::set_L2HysThreshold(double o) {L2HysThreshold = o; return;}
void HOGpython::set_gammaCorrection(bool o) {gammaCorrection = o; return;}
void HOGpython::set_nlevels(int o) {nlevels = o; return;}
PyObject* HOGpython::compute(PyObject* img, PyObject* locations)
{
// Déclaration d'instances :
cv::Mat im, pt;
PyObject* ret;
// Conversion :
NDArrayConverter cvt;
im = cvt.toMat(img);
pt = cvt.toMat(locations);
// Déclaration de vecteurs :
std::vector<float> desc;
std::vector<cv::Point> pts;
//Py_BEGIN_ALLOW_THREADS;
PyThreadState * m_thread_state;
m_thread_state = PyEval_SaveThread();
for(int i = 0; i < pt.rows; i++)
{
pts.push_back(cv::Point(pt.at<double>(i,0), pt.at<double>(i,1)));
}
eikeotools::CvAddenda::HOGDescriptor2::compute(im,desc,cv::Size(),cv::Size(),pts, false);
PyEval_RestoreThread(m_thread_state);
m_thread_state = NULL;
//Py_END_ALLOW_THREADS;
cv::Mat pointsMat = cv::Mat(desc);
ret = cvt.toNDArray(pointsMat);
return ret;
}
PyObject* HOGpython::computeSubPix(PyObject* img, PyObject* locations)
{
// Déclaration d'instances :
cv::Mat im, pt;
PyObject* ret;
// Conversion :
NDArrayConverter cvt;
im = cvt.toMat(img);
pt = cvt.toMat(locations);
// Déclaration de vecteurs :
std::vector<float> desc;
std::vector<cv::Point2f> pts;
//Py_BEGIN_ALLOW_THREADS;
PyThreadState * m_thread_state;
m_thread_state = PyEval_SaveThread();
for(int i = 0; i < pt.rows; i++)
{
pts.push_back(cv::Point(pt.at<double>(i,0), pt.at<double>(i,1)));
}
eikeotools::CvAddenda::HOGDescriptor2::computeSubPix(im,desc,cv::Size(),cv::Size(),pts, false);
PyEval_RestoreThread(m_thread_state);
m_thread_state = NULL;
//Py_END_ALLOW_THREADS;
cv::Mat pointsMat = cv::Mat(desc);
ret = cvt.toNDArray(pointsMat);
return ret;
}
PyObject* HOGpython::computeGradient(PyObject* img)
{
// Déclaration d'instances :
cv::Mat im, grad, angleOfs;
PyObject* listeRes;
PyObject* grad_;
PyObject* angleOfs_;
// Conversion :
NDArrayConverter cvt;
im = cvt.toMat(img);
//Py_BEGIN_ALLOW_THREADS;
PyThreadState * m_thread_state;
m_thread_state = PyEval_SaveThread();
eikeotools::CvAddenda::HOGDescriptor2::computeGradient(im, grad, angleOfs, cv::Size(), cv::Size());
PyEval_RestoreThread(m_thread_state);
m_thread_state = NULL;
//Py_END_ALLOW_THREADS;
// Conversion :
grad_ = cvt.toNDArray(grad);
angleOfs_ = cvt.toNDArray(angleOfs);
// Création d'une liste Python dans laquelle les deux résultats seront enregistrés :
listeRes = PyList_New(0);
PyList_Append(listeRes, grad_);
PyList_Append(listeRes, angleOfs_);
// Renvoie des données :
return listeRes;
}
不幸的是,我无法显示我的类 A(框架的一部分),但我可以看出 A 不会导致任何段错误。
只是总结一下我的代码,我想为 python 包装我的类 A,并且由于 A 包含一些 OpenCV 对象,Boost.Python 无法自动转换它们,所以我创建了从 A 派生的 B,但有一些从 opencv 对象到 Python 对象的转换。
为了进行转换,我有一个工作正常的转换模块。我想补充一点:这是我的主要代码,它给我一个段错误:
int main()
{
HOGpython h;
return 0;
}
最佳答案
这看起来像一个全局对象的析构函数(可能是一个 std::string
或与 std::string
有某种关系的东西)被调用但是要么该对象被手动删除,要么有人取得了该对象的所有权并将其删除。
请与我们分享更多代码,logwriter 类的源代码不应包含非常敏感的数据,它的存在可能有助于实际识别错误。
顺便说一句,请确保 ~B();
实际上有一个实现。
关于c++ - 使用 Valgrind 调试程序 - 检测段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36737694/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!