【发布时间】: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