Я работаю в 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);
}
По сути, я хочу знать следующее:
Есть ли какая-то причина, почему данные, полученные изкарта отличается от той, что хранится на карте?