В проекте, с которым мне пришлось работать, используются openGL, C и Tcltk. В настоящее время я отлаживаю утечку памяти с помощью инструментов трассировки памяти Tcl. Вот фрагмент кода, который вызывает ошибку:
//there is a check here to make sure context isn't null i.e. if(context != NULL)
glRotatef(context[model_index].rotation[0], 1, 0, 0); //error occurs here, sometimes varies between each
glRotatef(context[model_index].rotation[1], 0, 1, 0);
glRotatef(context[model_index].rotation[2], 0, 0, 1);
Вывод ошибки:
Exception thrown at 0x00007FFFF1C9AB21 (tkogl2.dll) in rsession.exe: 0xC0000005: Access violation reading location 0x00000000C284EFA2
Вот некоторый дополнительный код, чтобы дать некоторую ссылку на то, что именно является context
и как это используется:
//struct definition and intilization
typedef struct {
float x;
float y;
float z;
float scale;
float rotation[3];
} context_t;
context_t* context = NULL;
//memory allocation
if (context != NULL)
{
ckfree((char*)context);
context = NULL;
}
if (amount > 0)
{
context = (context_t*)ckalloc(amount*sizeof(context_t));
}
Я подумал, что, возможно, model_index
по какой-то причине слишком велик и делает его go за пределами границ, но его установка на 0
все еще вызывает ту же ошибку. Если context != NULL
является правильным способом проверки того, что контекст действительно существует, тогда он не должен быть NULL
при выполнении. Мне не хватает знаний, чтобы найти какие-либо дополнительные опции, которые могут быть причиной этого, поэтому я надеюсь получить представление о потенциальных возможностях, на которые я мог бы обратить внимание, чтобы более подробно изучить эту проблему.
Вот некоторые фрагменты кода, которые назначают значения атрибутов context
:
//rotations
const char* attr = Tcl_GetStringFromObj(objv[1], NULL);
if (strcmp(attr, "angle") == 0)
{
if (model_amount == 0)
{
return TCL_OK;
}
const char* d = Tcl_GetStringFromObj(objv[2], NULL);
double r;
Tcl_GetDoubleFromObj(interp, objv[3], &r);
/*apply rotations*/
switch (d[0]) {
case 'x':
context[model_index].rotation[0] += (float)r;
ANGLE_REDUCE(context[model_index].rotation[0]);
break;
case 'y':
context[model_index].rotation[1] += (float)r;
ANGLE_REDUCE(context[model_index].rotation[1]);
break;
case 'z':
context[model_index].rotation[2] += (float)r;
ANGLE_REDUCE(context[model_index].rotation[2]);
break;
}
char* msg = ckalloc(512);
sprintf(msg, "Rotate: %f %f %f",
context[model_index].rotation[0],
context[model_index].rotation[1],
context[model_index].rotation[2]);
Tcl_SetResult(interp, msg, TCL_DYNAMIC);
Tcl_ValidateAllMemory(__FILE__, __LINE__);
}
//scaling
if (model_amount == 0)
{
return TCL_OK;
}
const char* value = Tcl_GetStringFromObj(objv[2], NULL);
/*apply scaling*/
if (strcmp(value, "in") == 0)
{
context[model_index].scale += 0.1;
}
else if (strcmp(value, "out") == 0 && context[model_index].scale > 0.1)
{
context[model_index].scale -= 0.1;
}
Похоже, что также генерирует ошибку 0xffffffffffffffff