Вопрос о мелкой копии в C++

Понял. Поскольку я не программист, я понятия не имею, является ли это хорошим решением.

// start dispatch
if( $colname == 'dispatch' ) {
    // get items from the order global object
    $order_itemss = $the_order->get_items();

    // The orders date
    $order_date = $the_order->order_date;

    // The order date + 8-10 days
    $order_date_8d = date_i18n( 'D j M', strtotime( $order_date ) + ( 8 * 24 * 60 * 60 ) );
    $order_date_10d = date_i18n( 'D j M', strtotime( $order_date ) + ( 10 * 24 * 60 * 60 ) );


    if ( !is_wp_error( $order_itemss ) ) {
        foreach( $order_itemss as $order_itemm ) {

            echo $order_date_8d .' - '. $order_date_10d;
        }
        // end foreach
    }
    // end if
}
// end dispatch

Не для сложной части. Заставить его работать только с рабочими днями ...

С наилучшими пожеланиями

Магнус

5
задан Dima 19 October 2008 в 21:00
поделиться

3 ответа

Для следования тому, что сказанный [don.neufeld.myopenid.com], это не только мелкая копия, но и это, или (выберите) утечку памяти или висячий указатель.

// memory leak (note that the pointer is never deleted)
class A
{
  B *_b;
  public:
  A()
  : _b(new B)
  {
  }
};

// dangling ptr (who deletes the instance?)
class A
{
  B *_b;
  public:
  A()
  ... (same as above)

  ~A()
  {
    delete _b;
  }
};

Для разрешения этого существует несколько методов.

Всегда реализуйте конструктора копии и оператор = в классах, которые используют необработанные указатели памяти.

class A
{
  B *_b;
  public:
  A()
  ... (same as above)

  ~A()
  ...

  A(const A &rhs)
  : _b(new B(rhs._b))
  {
  }

  A &operator=(const A &rhs)
  {
    B *b=new B(rhs._b);
    delete _b;
    _b=b;
    return *this;
};

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

Сделайте конструктора копии и оператор = частными в Вашем классе. Это - "блокировка дверь" решение. Это является простым и эффективным, но иногда защитным.

class A : public boost::noncopyable
{
  ...
};

Никогда не используйте необработанные указатели. Это просто и эффективно. Существует много опций здесь:

  • Используйте строковые классы вместо необработанных символьных указателей
  • Станд. использования:: auto_ptr, повышение:: shared_ptr, повышение:: scoped_ptr и т.д.

Пример:

// uses shared_ptr - note that you don't need a copy constructor or op= - 
// shared_ptr uses reference counting so the _b instance is shared and only
// deleted when the last reference is gone - admire the simplicity!
// it is almost exactly the same as the "memory leak" version, but there is no leak
class A
{
  boost::shared_ptr<B> _b;
  public:
  A()
  : _b(new B)
  {
  }
};
8
ответ дан 18 December 2019 в 12:03
поделиться

Да, это - мелкая копия. У Вас теперь есть две копии s (один в вызывающей стороне, один на стеке в качестве параметра), каждый, которые содержат указатель на тот же самый блок памяти.

5
ответ дан 18 December 2019 в 12:03
поделиться

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

2
ответ дан 18 December 2019 в 12:03
поделиться
Другие вопросы по тегам:

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