Управляющий поток достигает конца функции [дубликат]

Строка ошибки «Ссылка на объект, не установленная на экземпляр объекта.» указывает, что вы не назначили экземпляр объекта объектной ссылке, и все же вы получаете доступ к свойствам / методам этого объекта.

например: скажем, у вас есть класс под названием myClass и он содержит одно свойство prop1.

public Class myClass
{
   public int prop1 {get;set;}
}

Теперь вы получаете доступ к этому prop1 в каком-то другом классе, как показано ниже:

public class Demo
{
     public void testMethod()
     {
        myClass ref = null;
        ref.prop1 = 1;  //This line throws error
     }
}

выше строки выдает ошибку, потому что ссылка класса myClass объявлена, но не создана, или экземпляр объекта не назначается referecne этого класса.

Чтобы исправить это, вам нужно создать экземпляр (присвоить объект ссылке на этот класс).

public class Demo
{
     public void testMethod()
     {
        myClass ref = null;
        ref = new myClass();
        ref.prop1 = 1;  
     }
}
15
задан Pascal Bayer 10 January 2011 в 09:25
поделиться

5 ответов

Для x86, по крайней мере, возвращаемое значение этой функции должно быть в регистре eax. Все, что было там, будет считаться возвращаемым значением вызывающего абонента.

Поскольку eax используется как регистр возврата, он часто используется как регистр «царапины» по вызову, потому что его не нужно сохранять. Это означает, что очень возможно, что он будет использоваться как любая из локальных переменных. Поскольку оба они равны в конце, более вероятно, что правильное значение останется в eax.

28
ответ дан Jabberwocky 27 August 2018 в 04:16
поделиться

GCC вставляет инструкцию «ret» в этом случае, в то время как clang pastes «ud2» и приложение вылетают во время выполнения.

0
ответ дан ARA1307 27 August 2018 в 04:16
поделиться

Он не должен работать и, конечно же, не работает на всех компиляторах и целевой ОС, даже если он работает на вас.

Вероятное объяснение состоит в том, что возвращаемая функция int всегда возвращает что-то, и обычно это содержимое регистра. Вероятно, регистр, используемый для возвращаемого значения, в вашем случае тот же, что и для вычисления последнего выражения перед возвратом из функции (на целевые объекты x86, конечно, eax).

При этом оптимизирующий компилятор обнаружив, что нет возврата, можно полностью удалить код этой функции. Впоследствии эффект, который вы видите (может) исчезнуть при активации более высоких уровней оптимизации.

Я тестировал его с помощью gcc:

gcc без оптимизации: входы 10, 20 -> результат равен 10

gcc -O1 входы 10, 20 -> результат 1

gcc -O2 входы 10, 20 -> результат равен 0

12
ответ дан kriss 27 August 2018 в 04:16
поделиться

В x86 возвращаемое значение сохраняется в регистре EAX, который «случайно» также используется этим компилятором для хранения результата арифметических операций (или, по крайней мере, вычитания). Вы можете проверить это, посмотрев сборку, сгенерированную вашим компилятором. Я согласен с kriss - вы не можете предположить, что это всегда будет так, поэтому лучше явно указать возвращаемое значение.

3
ответ дан Robert Kolner 27 August 2018 в 04:16
поделиться

Вам не нужен оператор возврата, если вы используете указатели. Как правило, вы можете вернуть только одно значение по оператору Return, но если вы используете указатели, вы можете вернуть сколько хотите.

scanf ("% d", & amp; x1); там вы даете функцию Adress of X1, а не значение X1. указатели работают с шириной адресов. вы можете читать книги, чтобы узнать, как работать с указателями.

-4
ответ дан VakhoQ 27 August 2018 в 04:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: