2012-05-07 5 views
-3

Я пытаюсь создать экземпляр объекта из статической функции-члена. Я определил:C++ Создание класса из статической функции

class A 
{ 
public: 
    A(); 
    A(int aParam); 
    ~A(); 
    static A* Creator(); 
private: 
    int m_nData; 
}; 

И Реализовано:

#include "A.h" 

A::A() 
{ 
} 

A::A(int aParam) 
{ 
    m_nData = aParam; 
} 

A::~A() 
{ 
} 

A* A::Creator() 
{ 
    return new A(0); 
} 

Он работает нормально, но есть проблемы при удалении объекта:

#include "A.h" 
#include <stdio.h> 

int main(int argc, char** argv) 
{ 
    A* pointer = A::Creator(); 

    delete pointer; 
    return 0; 
} 

Этот пример работает, как ожидалось. Я боюсь, что проблема может быть более сложной. Я попытаюсь дать более подробную информацию: У меня есть класс, похожий на описанный здесь в библиотеке dll (Windows). Когда я вызываю статическую функцию из своей программы, я получаю сообщение об ошибке (при отладке): HEAP [program.exe]: неверный адрес, указанный для RtlValidateHeap (0000000000BA0000, 000000000264B3D0) Windows вызвала точку останова в program.exe.

Это может быть связано с повреждением кучи, что указывает на ошибку в файле program.exe или в любой из загруженных DLL-файлов.

Как я уже протестировал, кажется, что вновь созданный объект выделяется в стеке.

Любая помощь будет оценена по достоинству.

+1

это даже не компилируется, отправьте компилируемое решение. –

+0

Единственное, что неправильно с кодом, который вы опубликовали, - это отсутствие определения деструктора и пары синтаксических ошибок. Это приведет к ошибке компоновщика, за исключением самых экстремальных ситуаций. То, что вы не показали, является виновником вашего краха. –

+0

Я ожидаю, что что-то еще не так. Объект определенно выделен в куче, и минимальный пример, который вы показали, должен работать нормально. Неужели этот точный пример так или иначе провалился или вы пропустили важную деталь, чтобы упростить его для публикации? –

ответ

0

Я думаю, что вам не хватает реализации деструктора. Компилятор должен предупредить вас об этом. С gcc и ранее упомянутым исправлением он работает.

Смежные вопросы