【问题标题】:Mixing C and C++, raw pointers and (boost) shared pointers混合 C 和 C++、原始指针和(增强)共享指针
【发布时间】:2011-03-07 15:33:53
【问题描述】:

我正在使用 C++ 处理一些遗留的 C 代码。

我有一个数据结构(在初始化期间),该结构复制指向传递给其初始化指针的 ptr 的结构。

这是我正在尝试做的简化 - 希望在“简化”中没有丢失任何重要的细节:

/* C code */

typedef struct MyData
{
   double * elems;
   unsigned int len;   
};

int NEW_mydata(MyData* data, unsigned int len)
{
    // no error checking
    data->elems = (double *)calloc(len, sizeof(double)); 
    return 0;
}

typedef struct Foo
{
   MyData data data_;
};


void InitFoo(Foo * foo, const MyData * the_data)
{
   //alloc mem etc ... then assign the STRUCTURE
   foo.data_ = *thedata ;
}


C++ code
-------------
typedef boost::shared_ptr<MyData> MyDataPtr;
typedef std::map<std::string, MyDataPtr> Datamap;

class FooWrapper
{
public:
   FooWrapper(const std::string& key) {
       MyDataPtr mdp = dmap[key];
       InitFoo(&m_foo, const_cast<MyData*>((*mdp.get())));
   }

   ~FooWrapper();

   double get_element(unsigned int index ) const {
      return m_foo.elems[index];
   }

private:
   // non copyable, non-assignable
   FooWrapper(const FooWrapper&);
   FooWrapper& operator= (const FooWrapper&);

   Foo m_foo;
};



int main(int argc, char *argv[])
{ 

   MyData data1, data2;
   Datamap dmap;

   NEW_mydata(&data1, 10);
   data1->elems[0] = static_cast<double>(22/7);

   NEW_mydata(&data2, 42);
   data2->elems[0] = static_cast<double>(13/21);

   boost::shared_ptr d1(&data1), d2(&data2);

   dmap["data1"] = d1;
   dmap["data2"] = d2;

   FooWrapper fw("data1");


   //expect 22/7, get something else (random number?)
   double ret fw.get_element(0);    
}

基本上,我想知道的是:

从地图中检索到的数据与地图中存储的数据有什么不同吗?

【问题讨论】:

  • 22/7 是整数除法,并且 MyData(因此也包括 Foo)不能安全复制,因为它包含指向堆内存的指针。
  • 如果您的示例在语法上正确且实际编译过,将会很有帮助。
  • 首先,将其重写为合法代码。当我们得到你所说的简化时,我们只能猜测任何事情,并且它没有显示你所看到的行为,因为它根本没有任何行为。其次,告诉我们你得到了什么。 “其他东西(随机数?)”告诉我们什么都没有用。如果每次运行的输出都相同,请说出来,并告诉我们它是什么。如果不是,请说出来,并列出一些值。如果您希望高素质的程序员免费回答您的问题,请至少与我们见面。
  • @David Thornley:“如果您希望高素质的程序员在没有任何报酬的情况下回答您的问题,请至少在中途与我们见面”公平点。我为没有得到足够的去道歉......我现在有很多球在空中。我再琢磨一下,如果还是想不通,我再花点时间写个sn-p,编译演示一下问题。谢谢
  • 你的代码在减少中被破坏了(但还是感谢你的尝试;)):你正在插入局部变量dmap,并尝试从本地fw中提取,它什么都不知道关于它。

标签: c++ c boost map shared-ptr


【解决方案1】:

使用 map 的 operator[] 插入元素会擦除存储在同一键上的先前数据,请尝试使用 insert 代替。 从 map 获取数据的处理相同,如果未存储您的 Key,operator[] 将创建一个元素,请尝试使用 find 代替。

另外const_cast&lt;MyData*&gt;((*mdp.get())) 会在 Mydata* 中投射一个 MyData,const_cast&lt;MyData*&gt;(mdp.get()) 会很好...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 2014-06-25
    • 2012-01-11
    • 2012-09-07
    • 1970-01-01
    • 2012-01-13
    • 2015-02-10
    • 1970-01-01
    相关资源
    最近更新 更多