Создание, жизнь и удаление экземпляра класса, что с памятью?

ustas

Элекомист №1
Alexandre
а еще есть массивы, в которых 100 кб обработаного текста могут превратится в 7-8 Mb
 
ustas
Каких еще едких замечаний? Называйте вещи своими именами, господа. Или дегенератам можно называть "винчестер" "сидиромом", ведь "из контекста понятно"?. Нечего сказать -- молчи, хочешь что-то сказать лично мне -- скажи, да так что бы я понял, а не на понятном тебе одному лишенном здравого смысла жаргоне мычания глухонемых (С).
 

Krishna

Продался Java
Насколько я помню, в PHP, в отличие от С++ нет локальной видимости для циклов.
Но объекты будут убиваться каждую итерацию потому, что ты присваиваешь их одной и той же переменной, а следовательно единственная ссылка на предыдущий объект будет утеряна => PHP удалит его из памяти.
 

phprus

Moderator
Команда форума
DpoHro
Вот вот а в С++ будет потеря блока памяти => лики
С чего бы это? Если объект класса создавать как стековую переменную, то при выходе за область видимости она будет автоматически уничтожена (в данном случае это произойдет при завершении итерации цикла, если конечно этот код на С++ переписать).
 

DpoHro

Новичок
PHP:
for (i=0;i<clCList->GetCount();i++)
{
  ...

  FactorList *clFList = new FactorList(); // Вот создание
  ...
}
Я не знаю что ты понимаешь под стековой переменной (наверное ты про область видимости), но при такой конструкции выделяемая память на каждой итерации будет потеряна. В VC++.
 

phprus

Moderator
Команда форума
DpoHro
То что ты написал - это создание объекта класса в динамической памяти.

Стековые переменные - это все переменные, которые размещаются в стеке, а не в динамической памяти. Те если написать так:

for (i=0;i<clCList->GetCount();i++){
...
FactorList clFList; // Вот создание
...
}
То на каждой итерации эта переменная будет автоматически создаваться, а в конце итерации она будет удаляться. Правда если нужно использовать именно объект созданный в динамической памяти, то лучше использовать умные указатели из STL, BOOST или еще откудато.

P.S. Упс. Пожалуй это уже оффтоп...
 

Alexandre

PHPПенсионер
Если в глобаьном смысле - этот класс предназначен для математических, так скть, расчетов по компаниям, ничего боле...
Если в данной конструкции PHP убъет память в конце цикла, перед началом новой итерации, то это меня устраивает!
возможно будет использоваться одна и та же область память для каждого объекта, присвоенного при итерации..
 

DpoHro

Новичок
phprus, ясно, это понятно.

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

Спасибо за проявленный интерес к теме.
 

ustas

Элекомист №1
раз тема исчерпана, подкину еще фишку объекта
PHP:
<?php
error_reporting(E_ALL);
class test
{
    public $v = 'y';
    public $w = 'w';
    public function __set($var, $val){
        var_dump('свойства с именем ' . $var . ' не существует');
    }
    public function t(){
        unset($this->v);
        $this->v =  $this->w; //эффект тот же (пусто)
        var_dump($this);
        echo '$this->v = & $this->r();<br>';
        $this->v = & $this->r();
    }
    private function & r(){
        return $this->w;
    }
}

$v = new test();
$v2 = 'e';
echo 'unset($v->v)<br>';
unset($v->v);
echo '$v->v = $v2<br>';
$v->v = $v2;
var_dump($v);
echo '$v->v = & $v2 <br>';
$v->v =  & $v2;
var_dump($v);
echo '$v->t();<br>';
$v->t();
var_dump($v);
unset($v->v)
$v->v = $v2

string 'свойства с именем v не существует' (length=33)

object(test)[1]
public 'w' => string 'w' (length=1)

$v->v = & $v2

object(test)[1]
public 'w' => string 'w' (length=1)
public 'v' => &string 'e' (length=1)

$v->t();

string 'свойства с именем v не существует' (length=33)

object(test)[1]
public 'w' => string 'w' (length=1)

$this->v = & $this->r();

object(test)[1]
public 'w' => &string 'w' (length=1)
public 'v' => &string 'w' (length=1)
уничтожение свойства, потом каким то макаром находит её только при присваивании по ссылке.
я не считаю это правильным поведением объекта
 
ustas
:confused:

-~{}~ 18.09.07 11:58:

Ты бы сначала мануал подчитал, $this->v = &$this->r() кросавчег..
 

ustas

Элекомист №1
ustas
да читал я мануал, я высказал мнение. вообще не считаю правильным возможность уничтожение свойства у объекта из вне, это как ноги оторвать. а потом только по ссылке твои пришить.
 
Сверху