【问题标题】:How to convert void* to std::vector<std::vector<std::string> >*?如何将 void* 转换为 std::vector<std::vector<std::string> >*?
【发布时间】:2015-02-13 17:57:13
【问题描述】:

下面给出了我的代码的某些部分。 这里 m_out 定义为:static_cast&lt;std::vector&lt;std::vector&lt;std::string&gt; &gt;* m_out;

问题出在给定行 m_out-&gt;push_back(row); 中。我得到“分段错误(核心转储)”,当我调试时,我发现上面给定行中的原因。 我认为,这是因为 for m_out 没有分配内存。如果是这样,我如何为给定的二维向量分配内存?

int some_space::database::callback(void* data, int argc, char** argv, char** col_name)
 {
     if(m_out != 0) {
         m_out->clear();
     }   
     m_out = static_cast<std::vector<std::vector<std::string> >*>(data);
     std::vector<std::string> row;
     for(int i = 0; i < argc; ++i){
         row.push_back(argv[i] ? argv[i] : "(NULL)");
     }
     m_out->push_back(row);
     return 0;
 }

谢谢大家。我解决了我的问题。我改变了这样的代码。 现在 m_out 是一个变量而不是指针static_cast&lt;std::vector&lt;std::vector&lt;std::string&gt; &gt; m_out;

int some_space::database::callback(void* data, int argc, char** argv, char** col_name)
 {
    if(m_out.size() != 0) {
        m_out.clear();
    }   
    for( int i = 0; i < 6; i++ ) { 
        m_out.push_back(std::vector< std::string >());
     }   
     for(int i = 0; i < argc; ++i) {
         m_out[i].push_back(std::string( (char *)argv[i] ? argv[i] : "(NULL)"));
     }   
     return 0;
 }

这很好用:)

【问题讨论】:

  • 你不说你得到了什么错误......
  • 什么是m_out?您的最小测试用例在哪里?
  • 我在线路上得到“分段错误”:m_out->push_back(row);
  • m_out 是 static_cast<:vector> >* m_out;
  • 我看不出你创建行的方式有什么问题,所以 m_out 必须为空。

标签: c++ memory vector stl new-operator


【解决方案1】:

你声称data 指向一个向量。如果不是这样,这将不起作用。

您必须首先创建一个向量,并确保将指向它的指针作为data 传递(无论它来自哪里)。例如,它可能看起来类似于:

db.set_callback_data(new std::vector<std::vector<std::string> >);

【讨论】:

  • 我希望它不会看起来像那样,因为那是泄漏......但我知道这是一个例子。
  • 那么 OP 要求的是泄漏或单元化内存访问;)
  • @EdS。不一定 - 回调将指针保存在 m_out 中,因此可以稍后将其释放。不过,我同意这是管理对象生命周期的一种非常糟糕的方式。
  • 对不起,你是对的;没有注意到它不是函数本地的。当然,他的设计只是自找麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
相关资源
最近更新 更多