【问题标题】:memory problems with class from linked library链接库中的类的内存问题
【发布时间】:2015-12-04 12:49:03
【问题描述】:

我有一个静态库,其中包含一些基本的 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 对象内部的东西没有正确初始化。

【问题讨论】:

  • 你不是说testClass test; 在你的main 函数中吗?
  • 正确! testClass 测试。
  • “当使用共享指针实例化类时它不起作用”,什么不起作用?您是否遇到任何编译错误或其他问题?
  • 陈述您的问题 - 描述当前输出(行为、编译错误、段错误发生等)并描述您的预期输出(例如预期行为)
  • 编译得很好,但是如果我尝试向图中添加一个顶点,我会遇到未分配的内存问题。就像没有发生适当的初始化一样。见编辑。

标签: c++ boost clang static-libraries


【解决方案1】:

如果我用一个简单的 vGraph 图替换 std::shared_ptr 图,一切似乎都正常。知识的愚蠢运气?

如果我做对了,这行不通:

void main(){
    std::shared_ptr<vGraph> graph;
    test.randomGraph();
}

但这确实:

void main(){
    vGraph test;
    test.randomGraph();
}

我的理解是,声明 std::share_ptr&lt;vGraph&gt; 只会声明一个(共享的)指针,指向一个潜在的 vGraph 对象,但声明一个 vGraph 对象,正如预期的那样, 将声明和定义一个静态分配的对象。

【讨论】:

  • 不。 OP明确说明,即使用graph = std::make_shared&lt;vGraph&gt;();,所以这会动态分配对象。
  • 原帖在代码中有几个拼写!我主要初始化 testClass 测试。不是图表。
猜你喜欢
  • 2011-02-25
  • 2022-01-27
  • 1970-01-01
  • 2011-04-08
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多