Я должен удалить вектор <строка>?

Вы получите эту ошибку на некоторых Samsung, Sony, ... Внедрение ICS. Оба, которые я основал, включают в себя странные внутренние представления управления. Одним из решений этого является расширение RecyclerView (или класса, который генерирует проблему) с вашим собственным классом и использование этого. В этом классе вы будете «съедать» все возможные исключения для этих устройств. Это уродливо, это ужасно, но это все, что я могу сделать, чтобы решить такие проблемы.

Для вашей конкретной проблемы с scrollTo ....

package com.stackoverflow.customviews;

public class CustomRecyclerView extends RecyclerView{

  private static final String TAG = "CustomRecyclerView";

  public CustomRecyclerView(android.content.Context context) {
    super(context);
  }

  public CustomRecyclerView(android.content.Context context, android.util.AttributeSet attrs) {
      super(context, attrs);
  }

  public CustomRecyclerView(android.content.Context context, android.util.AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
  }

  @Override
  public void scrollTo(int x, int y) {
      Log.e(TAG, "CustomRecyclerView does not support scrolling to an absolute position.");
     // Either don't call super here or call just for some phones, or try catch it. From default implementation we have removed the Runtime Exception trown 
  }
}

Затем вы можете заменить в своем макете XML этот новый класс:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="wrap_content">

<com.stackoverflow.customviews.CustomRecyclerView
    android:id="@+id/my_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:overScrollMode="never"
    android:scrollbars="vertical" />

</FrameLayout>
19
задан Chris Martin 4 November 2014 в 07:56
поделиться

8 ответов

Правило состоит в том, что когда вы очищаете вектор от объектов, будет вызываться деструктор каждого элемента. С другой стороны, если у вас есть вектор указателей, vector :: clear () не будет вызывать для них delete , и вам придется удалить их самостоятельно.

Итак. если все, что у вас есть, - это вектор строк, а не указатели на строки, то утечки памяти должны быть вызваны чем-то другим.

24
ответ дан 30 November 2019 в 02:34
поделиться

As rlbond suggested, use RAII.

It's a good rule of thumb to never put new and delete calls into your main code flow. Always try to put them into objects so that the object destructor can free what needs to be freed. In this way, you avoid needing to remember to call delete and it makes your code exception safe (assuming that you make your object's operations exception safe).

For example, if you had a vector of pointers to STL strings or C-style character arrays, put that into a StringContainer (use a better name) and have the StringContainer hold a vector and in the StringContainer destructor run a for loop to delete each string in the vector.

You can make the vector inside the StringContainer a public member and mess around with it directly, but it's even better design to make it private or protected and add some member functions to manage the string* vector.

So your main C++ program should never see a new or delete anywhere. Instead it should have a lot of stack allocated objects, auto_ptrs and shared_ptrs.

0
ответ дан 30 November 2019 в 02:34
поделиться

Вам не нужно этого делать. std :: string очищает себя, поэтому строки не ваша проблема. Помните, что ВЫ не использовали new , поэтому ВАМ не нужно использовать delete .

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

9
ответ дан 30 November 2019 в 02:34
поделиться

Вызов v.clear () уничтожит все объекты, которые в настоящее время хранятся внутри v , но не освободит память (предполагается что вектор скоро будет снова заполнен).

Если вы действительно хотите освободить память, используйте идиому

vector<string>().swap(v);

Это создаст новый (временный) вектор и заменит его содержимое на v . Затем временный вектор уничтожается, освобождая вместе с ним память.

7
ответ дан 30 November 2019 в 02:34
поделиться

Удаление элементов из контейнеров STL гарантированно вызовет деструкторы для этих элементов. Однако, если у вас есть контейнер некоторого типа указатель на T , вам все равно придется самостоятельно освободить указанную память (в этом случае вызывается "деструктор" для указателя, который не является операцией).

Если вы не хотите вручную управлять памятью в этом случае, рассмотрите возможность использования решения интеллектуального указателя или контейнера указателя .

5
ответ дан 30 November 2019 в 02:34
поделиться

вектор (как и все стандартные контейнеры) владеет объектами внутри него.
Таким образом, он отвечает за их уничтожение.

Примечание: если ваш вектор содержит указатели, то он владеет указателями (а не тем, на что указывают указатели). Так что их нужно удалить. Но есть более простые способы.

Вы можете использовать вектор интеллектуальных указателей. Фактически, вы должны использовать какую-то форму умного указателя почти для всего. Если вы используете указатели, вы, вероятно, все еще программируете как программист на C.

Итак:

std::vector<int>    data; // clear is fine.

std::vector<int*>   data1; // Now things need to be deleted.
// alternative 1:
std::vector<boost::shared_ptr<int> >  data2; // The shared pointer will auto
                                             // delete the pointer.
// alternative 2:
boost::ptr_vector<int>  data3;               // Here the container knows that
                                             // it is holding pointers and will
                                             // auto de-reference them when you
                                             // its members.

Но похоже, что вам нужно начать думать об изучении интеллектуальных указателей.

int*  x = new int(5);
// Do stuff.
*x = 8;
delete x;

// --- Instead use a smart pointer:
std::auto_ptr<int>  x(new int(5));
// Do stuff.
*x = 8;
// No delete (the auto ptr handles it.
5
ответ дан 30 November 2019 в 02:34
поделиться

Если у вас есть вектор, и он выходит за пределы области видимости, все объекты в векторе уничтожаются. На самом деле нет необходимости вызывать clear (), если вы не хотите сбросить содержимое и повторно использовать вектор.

Однако, если вы случайно используете что-то вроде вектора, то деструктор объектов, на которые указывает, не будет вызывается, поскольку деструктор вектора не следует косвенным указаниям, представленным указателями.

Все сказанное, действительно ли вы подтвердили, что у вас есть настоящие утечки памяти и что они вызваны данными в векторе?

2
ответ дан 30 November 2019 в 02:34
поделиться

Приведите пример использования. Деструктор строки вызывается вектором :: clear. Ваша проблема в другом, мой друг.

также проверьте:

Удаляет ли std :: vector.clear () (свободную память) для каждого элемента?

0
ответ дан 30 November 2019 в 02:34
поделиться
Другие вопросы по тегам:

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