Я столкнулся с проблемой использования VC++ и Debug CRT с DLL в разработке.
У меня есть такая структура, содержащая некоторые ссылки.
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;
}
теперь он должен содержать неинициализированные ref-to-ptrs, которые я хочу инициализировать:
void func(TA* a, TB* b, TC* c, TD* d)
{
Get()->a = a;
Get()->b = b;
Get()->c = c;
Get()->d = d;
...
}
который работает для всего, но ref-to-ptrs..
Я получаю INVALID_POINTER_WRITE_FILL_PATTERN_cdcdcdcd
на первом Get()->a = a;
, когда я делаю !analyze -v -f
с помощью WinDbg (в удаленном экземпляре "kd" отладки ядра)
Спасибо за вашу помощь! :)
Изменить: решение
Решение состоит в том, чтобы использовать баллы за правильный ответ.
Сделать 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
};
затем с помощью placement new
для построения структуры:
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 = ...
...
}
освободить все это нужно явно, вызвав d'tor и free
, потому что мы используем placement new
:
data->~DATA();
free(data);