在malloc()之后初始化结构中对ptr的引用
Initializing a ref-to-ptr in a struct after malloc()
我在开发过程中遇到了使用VC++和带有DLL的调试CRT的问题。
我有一个类似的结构,包含一些引用。
struct DATA
{
TA*& a;
TB*& b;
TC*& c;
TD*& d;
char** chars;
int num_chars;
private:
// because:
// DATA a;
// DATA b;
// a = b; // is impossible
DATA& operator=(const DATA&); // append " = delete;" for C++11
// Default ctor (private because struct should be manually constructed using malloc)
DATA(TA*& a, TB*& b, TC*& c, TD*& d)
: a(a),
b(b),
c(c),
d(d),
chars(NULL),
num_chars(0)
{}
};
并像这样构建:
DATA*& Get()
{
static struct DATA *data = (struct DATA*)malloc(sizeof(struct DATA));
return data;
}
现在它应该保存未初始化的对ptrs的引用,我想通过初始化它
void func(TA* a, TB* b, TC* c, TD* d)
{
Get()->a = a;
Get()->b = b;
Get()->c = c;
Get()->d = d;
...
}
它适用于所有事情,但引用ptrs。。
当我使用WinDbg(在远程内核调试"kd"实例中)执行!analyze -v -f
时,我在第一个Get()->a = a;
上得到了一个INVALID_POINTER_WRITE_FILL_PATTERN_cdcdcdcd
谢谢你的帮助!:)
编辑:解决方案
解决方案是使用正确答案中的要点。
公开c'tor是必要的:
struct DATA
{
TA*& a;
TB*& b;
TC*& c;
TD*& d;
char** chars;
int num_chars;
// Default ctor
DATA(TA*& a, TB*& b, TC*& c, TD*& d)
: a(a),
b(b),
c(c),
d(d),
chars(NULL),
num_chars(0)
{}
private:
// because:
// DATA a;
// DATA b;
// a = b; // is impossible
DATA& operator=(const DATA&); // append " = delete;" for C++11
};
然后用CCD_ 4构造结构体:
DATA*& Get(...)
{
// ... some stuff, overloading, other init-method etc. to init and construct like:
static struct DATA *data =
new(malloc(sizeof(struct DATA))) DATA(...); // At least assign ALL references in the c'tor
return data;
}
然后使用它,也许可以分配所有没有参考的东西:
void func(TA* a, TB* b, TC* c, TD* d)
{
Get(a, b, c, d);
Get()->chars = ...
...
}
释放整个过程需要通过调用'tor和free
来显式完成,因为我们使用placement new
:
data->~DATA();
free(data);
您不能在不初始化引用的情况下声明引用。您的struct
没有默认构造函数,因为您显式声明了一个非默认构造函数。仅仅分配malloc
不足以创建有效的DATA
对象,因为它是非POD类型。
只需继续尝试声明一个真正的默认构造函数(即DATA() {}
),您就会发现由于引用成员的原因,这将不起作用。如果要使用malloc
来分配非POD对象,则必须使用放置new
。
malloc()
返回未初始化的内存。需要构造C++对象。将对象放入未初始化内存的方法是使用placementnew(此代码还添加了清理):
#include <new>
DATA*& Get()
{
static DATA *data = new(malloc(sizeof(struct DATA))) DATA(...);
static std::unique_ptr<DATA, void(*)(DATA*)> clean(data,
[](DATA* d){
d->~DATA();
free(data);
});
return data;
}
C++中没有重新设置引用的方法,也就是说,它们需要在构造过程中设置。就我个人而言,我不会使用malloc()
,而是一个合适的分配:
static DATA* data(new DATA(...));
或者,正如Jarod42所指出的,实际上是
static DATA data(...);
return &data;
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 引用 std::shared:ptr 以避免引用计数
- 如何控制共享 ptr 引用计数?
- 对唯一 ptr 无效读取的引用向量
- C++ 类型转换基础 PTR 到派生 PTR 保存在引用类中
- 为什么在将常量 ptr 分配给常量引用时没有收到编译错误?
- C 在多个引用上共享PTR发布
- 取消引用适用于 ptr->运算符*(),但不适用于 *ptr
- 在记录错误时取消引用 ptr 的设计是错误的
- 如何检测ptr在引用超出范围后是否仍在引用有效引用
- 在malloc()之后初始化结构中对ptr的引用
- 我应该通过引用、值或ptr来存储一个完全封装的成员吗
- 添加对共享ptr的引用会增加引用计数吗?
- 将字符串引用作为参数传递时Ptr错误
- 共享 PTR - C++ 如何使用引用计数管理对象缓存