2015-11-24 2 views
0

Рассмотрим следующую программу (подробнее см видеодемонстрацию here)Почему D не позволяет создавать объекты в стеке?

import std.stdio; 
class myclass 
{ 
    public: 
    int get_a() 
    { 
     return a; 
    } 
    private: 
    int a=3; 
} 
int main() 
{ 
    myclass m; // It should be myclass m=new myclass(); 
    writefln("%d",m.get_a()); 
    return 0; 
} 

C++ поддерживает как автоматические (стек), выделенные & динамические (в куче) объектов. Но почему каждый объект класса должен динамически выделяться в D? Почему D не поддерживает выделенные объекты?

другой удивительным является то, что ideone дает ошибку компилятора как:

prog.d(14): Error: null dereference in function _Dmain 

Но когда я попробовал его на моей локальной машине на dmd2 компилятор дает мне ошибки во время выполнения не ошибка компиляции времени. Зачем? Почему поведение этой программы отличается? Ниже приведена ошибка, которую я получил на моей локальной машине, заданной dmd2.

[email protected](0): Access Violation 
---------------- 
0x00402056 
0x00405F9B 
0x00405EB1 
0x00403D93 
0x7651EE6C in BaseThreadInitThunk 
0x7758377B in RtlInitializeExceptionChain 
0x7758374E in RtlInitializeExceptionChain 
+0

«Все переменные являются ссылками» довольно распространены. Среди языков, с которыми я знаком, такие вещи, как C и C++, которые позволяют вам определять типы со значениями семантики, являются исключением, а не правилом. – Hurkyl

+2

D позволяет вам определять типы с семантикой значений, как структуры, а не классы. Классы всегда доступны через ссылку, но там, где вы выделяете память, она ссылается на вас - в том числе на стек. Разумные классы всегда через ссылку - это почти всегда так, как вы хотите это сделать, даже в C++, поэтому D следовал примеру Java и делал его по умолчанию. Но класс - это не единственный способ определить типы пользователей, поэтому не забывайте о структуре! –

ответ

9

D позволяет размещать классы в стеке, см. std.typecons.scoped.

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

+0

, то что не так с этой программой. См. Здесь: http://ideone.com/6p9isc. он не подходит для компиляции. почему компилятор показывает ошибку? – Destructor

+2

'import std.typecons;' –

+0

ОК спасибо. Но в чем польза! оператора перед конструктором? & Если я пишу myclass m = scoped! Myclass(); & вызывать функцию члена get_a(), это приводит к ошибке времени выполнения? Зачем? Еще раз спасибо – Destructor