我有一个带有一些基本的boost图形功能的静态库,所有这些都封装在类' vgraph'。
使用共享指针实例化类时,它不起作用,所有内容似乎都未分配。 如果我不使用指针,那似乎没问题。
我错过了什么?当静态库中使用的代码集成在主源中时,一切都可以正常使用智能指针。没问题。
示例代码:
#ifndef testClass_hpp
#define testClass_hpp
#include <stdio.h>
#include <vector>
#include <string>
#include <random>
#include <iostream>
#include <memory>
class vGraph { // from the static library
public:
vGraph();
~vGraph();
void test();
unsigned long addVertex(bool _di);
void addEdge(unsigned long a, unsigned long b, bool _di = true);
int getNumVerts(bool di);
int getNumEdges(bool di);
std::vector<std::string> computeXD(bool choice);
std::vector<std::string> computeXDdi(bool choice);
int unlinkEdge(int a, int b);
int linkDiEdge(int a ,int b);
};
class testClass {
public:
void randomGraph();
std::shared_ptr<vGraph> graph;
};
#endif /* testClass_hpp */
#include "testClass.hpp"
void testClass::randomGraph() {
graph = std::make_shared<vGraph>();
std::vector<unsigned long> verts;
for (int i=0; i<2000; ++i) {
verts.push_back(graph->addVertex(true));
}
std::cout << graph->getNumVerts(true);
for (int i=0; i<5000; ++i) {
graph->addEdge(std::rand()%2000, std::rand()%2000);
}
graph->computeXDdi(true);
}
#
void main(){
testClass test;
test.randomGraph();
}
#
如果我用简单的vGraph图替换std :: shared_ptr图,一切似乎都没问题。 愚蠢的缺乏知识?
编辑以使事情更清晰。
编译工作没有错误。在运行时,如果我将testClass中的vGraph声明为std :: shared_ptr,我会得到未分配的内存错误。
像:
malloc: *** error for object 0x648000021ce0: Invalid pointer dequeued from free list
*** set a breakpoint in malloc_error_break to debug
如果我使用共享指针,那么在vGraph对象内部没有正确初始化。
答案 0 :(得分:-1)
如果我用简单的vGraph图替换std :: shared_ptr图,一切似乎都没问题。愚蠢的知识运气?
如果我做对了,这不起作用:
void main(){
std::shared_ptr<vGraph> graph;
test.randomGraph();
}
但这样做:
void main(){
vGraph test;
test.randomGraph();
}
我的理解是,声明std::share_ptr<vGraph>
只会向潜在的 vGraph 对象声明(共享)指针,但声明vGraph
正如预期的那样,object将声明并定义一个静态分配的对象。