Скопируйте данные из локального указателя для возвращаемого значения - PullRequest
0 голосов
/ 07 января 2011

Вот теоретический вопрос для вас, экспертов по сборке, работающих на C ++.Я часто хочу вернуть строку (char * или wchar *) из локальной переменной внутри функции.Как вы знаете, это невозможно сделать, так как локальная переменная теряет область видимости.Это вызывает у меня любопытство. Можно ли будет вытолкнуть данные, хранящиеся в этом месте, из функции?

Позвольте мне проиллюстрировать:

char *IllegalFunc()
{
    char *ret = "Hello World";
    return ret; //warning: returning the adress of a local variable
}

//what we are attempting
char *IllegalAndMostlyIllogicalFunc()
{
    char *ret = "Hello World";
    __asm {
        //somehow copy *ret to ESP and return 
    }
}

char *ARightWayToDoIt()
{
    char *ret = new char[12];    
    strcpy(ret, "Hello World");
    return ret;
}

Это просто для любопытстват, я использую метод __asm ​​... я, вероятно, просто объявлю статический символ *, чтобы я мог импортировать функцию, как в c #

[dllimport(...)]
string IllegalFunc();

[dllimport(...)]
string ARightWayToDoIt(); //memory leak, I would need a FreeLastString() method

Ответы [ 4 ]

6 голосов
/ 07 января 2011

Этот код не течет, так как литеральные строки статически размещаются. Совершенно законно возвращать локальные указатели , но не указатели на местных жителей. Однако вы можете запросить, чтобы управляемый пользователь передал возвращаемое значение свободной функции, которую вы написали, а затем вы можете использовать malloc- или new.

4 голосов
/ 07 января 2011

Поскольку вы находитесь в C ++, почему бы просто не вернуть std :: string?

Редактировать:

DeadMG указывает, что вы импортируете функцию из C #,Обычный подход в C состоял в том, чтобы передать символьный буфер в функцию в качестве аргумента.Из того, что я прочитал, это работает и здесь.См., Например, этот предыдущий вопрос .

3 голосов
/ 07 января 2011

Как эксперт по сборке, работающий в C ++, я могу заверить вас, что встроенный код сборки здесь совершенно не подходит: -)

1 голос
/ 07 января 2011

Я не эксперт, но я знаю, что пролог и код эпилога могут испортить то, что вы хотите сделать. Если вы действительно делаете это (что, разумеется, является плохой практикой), взгляните на голый .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...