Разница в том, что хранится в объекте CArray
и как оно хранится в объекте, независимо от того, являются ли элементы CArray
объектами или указателями на объекты некоторого класса.
CArray
, кажется, имеет несколько неожиданных поведений. Это было вокруг в течение долгого времени и было разработано, чтобы вписаться в экосистему МФЦ. Стандартная библиотека шаблонов C ++ vector
имеет гораздо более приятные и более общие характеристики, особенно при работе с объектами, отличными от простых типов данных.
Мой опыт был с использованием CList
и CArray
с указателями на объекты. Делая это, они кажутся более предсказуемыми, хотя вам нужно беспокоиться об управлении памятью.
Одной из проблем при просмотре источника в afxtempl.h
является то, что когда CArray
увеличивается с помощью внутренней функции SetSize()
, функция memcpy_s()
используется для копирования CArray
элементов из одной области памяти в другой. Поэтому вы должны быть осторожны с указателями и поверхностным копированием элементов CArray
. А поскольку используется memcpy_s()
, а не memmove_s()
, если вы делаете что-то необычное с пересекающимися областями памяти, может возникнуть проблема.
Возможно, поэтому мой опыт использования CArray
в качестве контейнера для указателей на объекты, кажется, работает намного лучше.
Интересно то, что, похоже, методы Append()
и Copy()
используют внутреннюю функцию CopyElements()
, которая выполняет присваивание элемента за элементом, а не вызов функции memcpy_s()
. Однако эти методы используются с CArray
объектами, а не с отдельными элементами.
CArray
получено из CObject
, что означает, что в структуре данных будет весь багаж CObject
. Однако есть и некоторые хорошие вещи, которые CObject
приносит в мире MFC, такие как сериализация.
Похоже, вы должны использовать ссылку в качестве второго аргумента шаблона, поэтому вы должны использовать CArray <SomeClass, SomeClass &> collection;
, если вы используете класс. Я столкнулся с проблемами, когда не сделал этого, пока не обнаружил раздел Создание списка массивов из Коллекции MFC: класс CArray .