По умолчанию вы не должны использовать ничего, только статическое распределение:
QPushButton button;
QApplication app(argc,argv);
std::string s;
int a = 0;
Доступ к членам класса / структуры осуществляется через .
, например: s.append( "test" )
Когда вы передаете его функции, если вам не нужна копия, используйте ссылку
void myFunction( std::string & s ){}
myFunction( s );
Если вы не хотите изменять параметр, но по-прежнему не хотите копировать, используйте константную ссылку:
void myFunction( const std::string & s ) {}
myFunction( s ); // we know s won't be modified
Это основное, что вы используете по умолчанию. Видите ли, это довольно просто. Переменные автоматически освобождаются, когда они выходят из области видимости.
Затем идут указатели. Вы должны использовать указатели для динамического выделения памяти в куче или свободном хранилище.
int * p = new int[4]; // allow 4 doubles on the free store
p - адрес первого элемента из 4-х целых. *p
является значением первого целого числа. В нашем примере p [1] дает значения второго целого. Доступ к членам класса / структуры осуществляется через ->
(вместо .
). ->
является эквивалентом (*variable).
Если у вас есть статическая переменная, выделенная как:
int i = 0;
, затем &i
- это адрес, а i
- это значение.
Вам могут понадобиться указатели с переменными, которые не ограничены областью действия, с функциями, которые принимают адреса в качестве аргументов, с полиморфизмом (указатель дочернего класса на указатель базового класса)
В отличие от статического размещения, вам нужно явно уничтожить указатели. Следовательно, вы используете
delete[] p; // allocated with new[]
delete p2; // allocated with new
Здесь вы можете получить утечки памяти, если забыли удалить память.
Вот почему "умные указатели", когда они были изобретены, это указатели, которые автоматически удаляют их содержимое, когда их больше никто не использует. Например, boost :: shared_ptr или, возможно, ваш компилятор поддерживает tr1 :: shared_ptr.
Используется так:
boost::shared_ptr< int > a( new int( 42 ) );
И удалять его не нужно