我遇到了Memory corruption with libtorrent-rasterbar and QGuiApplication中描述的类似问题。
在我的情况下,vtk-reader(vtkPDBReader
)在QGuiApplication app(argc, argv)
之后调用时返回错误的值。该程序在64位Ubuntu系统上运行。
相关问题的答案对我没有帮助。据我所知,QGuiApplication
以某种方式改变了系统执行其他功能的方式,但我不知道如何将其应用于我的问题。
谁能就如何解决这个问题给出更一般的答案?
我使用shared_libs选项构建VTK,并通过cmake完成链接。
谢谢。
这是一个最小的例子:
的CMakeLists.txt
cmake_minimum_required(VERSION 2.8.11)
file(GLOB_RECURSE SOURCES *.cpp)
file(GLOB_RECURSE HEADER *.h)
set(CMAKE_AUTOMOC ON)
FIND_PACKAGE(Qt5Widgets REQUIRED)
find_package(VTK REQUIRED)
if(VTK_LIBRARIES)
include_directories(${VTK_INCLUDE_DIRS})
endif()
add_executable(test ${SOURCES} ${HEADER})
target_link_libraries(
test
${VTK_LIBRARIES}
${Qt5Widgets_LIBRARIES}
)
的main.cpp
#include "qguiapplication.h"
#include "vtkPDBReader.h"
#include "vtkSmartPointer.h"
#include "vtkPolyData.h"
#include "vtkPointData.h"
#include "vtkPoints.h"
void load(){
vtkSmartPointer<vtkPDBReader> pdb =
vtkSmartPointer<vtkPDBReader>::New();
std::string molFile = "PDBfile.pdb";
pdb->SetFileName(molFile.c_str());
pdb->Update();
// prepare a vector that will contain xyz
std::vector<float> atomPositions;
atomPositions.clear();
for(vtkIdType i = 0; i < pdb->GetOutput()->GetNumberOfPoints(); i++)
{
double p[3];
p[0] = 0;
p[1] = 0;
p[2] = 0;
pdb->GetOutput()->GetPoint(i, p);
atomPositions.push_back(p[0]);
atomPositions.push_back(p[1]);
atomPositions.push_back(p[2]);
}
}
int main(int argc, char *argv[]) {
load(); // works fine
QGuiApplication app(argc, argv);
load(); // read data is corrupt
}
load()
的第一次调用按预期工作。对于第二个调用,在QGuiApplication app(argc, argv);
之后,p[0]
包含转换为整数的预期值,p[1]
始终设置为4.59163e-41且p[2]
始终为0. / p>