来自链接库的类的内存问题

时间:2015-12-04 12:49:04

标签: c++ boost clang static-libraries

我有一个带有一些基本的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对象内部没有正确初始化。

1 个答案:

答案 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将声明并定义一个静态分配的对象。