Исключение Stackoverflow возникает при создании экземпляра неуправляемого класса из графического интерфейса пользователя. - PullRequest
0 голосов
/ 29 апреля 2018

Я пишу графический интерфейс c ++ / clr, чтобы обернуть некоторый неуправляемый код c ++, который пишу для целей тестирования.

Я использую прокси-класс с именем HolderOfUnmanagedStuff, чтобы создать несколько неуправляемых объектов, которые мне нужны в моем clr gui.

#pragma once
#include "foo.h"
namespace fooCore
{
    public class HolderOfUnmanagedStuff
    {
    public:
        HolderOfUnmanagedStuff()
        {
            foos = std::vector<fooCore::foo>();
        }
        ~HolderOfUnmanagedStuff() { }
    public:
        std::vector<fooCore::foo> foos;
        void addFoo(std::string & fileName)
        {
            whatever code on the first line    // <-- System.StackOverflowException

            foo myfoo(FileName);  // <--- when I comment those 2 lines no exception
            foos.push_back(foo);  //      but exception when I comment only this one
        }
        otherUnmanagedMembers ...
    };
}

Мой класс foo использует конструктор, который читает объект из файла:

#pragma once
namespace fooCore
{    
    class foo
    {
    public:
        foo();
        foo(std::string & fileName);
        ~foo();

         fooMembers...
    };
}

Всякий раз, когда я пытаюсь создать экземпляр класса foo, я получаю исключение Stack OverFlow с разрывом в первой строке функции.

Стек вызовов показывает только логическую иерархию вызовов: событие кнопки, затем вызов функции addFoo, и это все

Я перепробовал несколько решений, переписал каждый конструктор, проверил наличие неуправляемых / управляемых конфликтов, указателей, адресов, ссылок.

Я многому научился (очевидно, поскольку я не писал неуправляемый код в течение 15 лет), но не могу найти проблему. Есть идеи?

РЕДАКТИРОВАТЬ

Я попробовал несколько вещей:

  1. добавил пользователя foo в мой держатель: OK

  2. пытается определить этот элемент в конструкторе: исключение в конструкторе

  3. нажатие элемента foo на вектор foo в функции addFoo: OK

  4. определение элемента foo в addFoo: исключение

Следующий код показывает 4 теста, которые я сделал:

public class HolderOfUnmanagedStuff
{
    public:
        HolderOfUnmanagedStuff()
        {
            ...
            memberFoo = foo(); // TEST 2 : SOF exception on the first line of the constructor
        }
        ~HolderOfUnmanagedStuff() { }
    public:
        foo memberFoo;    // TEST 1 : No exception with that line 
        std::vector<fooCore::foo> foos;
        void addFoo(std::string & fileName)
        {
            ...               
            foos.push_back(memberFoo);  // TEST 3 No exception with that line
            memberFoo = foo();  // TEST 4 SOF on the first line of the function
        }
        otherUnmanagedMembers ...
    };

1 Ответ

0 голосов
/ 30 апреля 2018

Исключение было связано с тем, что мой класс foo был слишком большим для стека.

Я изменил свой код так, чтобы каждый объект foo объявлялся в сегменте данных (в куче) конструктором по умолчанию. Нет больше переполнения стека, и структура данных более логична.

...