2 определенных проблемы и 1 потенциальная проблема с вашим кодом. Основная проблема, вызывающая вашу проблему в первую очередь: Name
само передается по значению. Это означает, что когда вы присваиваете ему в самой первой строке своей функции, когда вы new
память, вы назначаете копию, а не оригинал! У вас есть три варианта: 1) сохранить двойной указатель, сделать так, чтобы вызывающая сторона отвечала за выделение памяти, и добавить третий параметр для количества имен, которые может содержать массив (рекомендуется), или 2) сделать Name тройным указателем (wchar_t*** Name
) и затем вы можете присвоить ему, разыменовав его: *Name = new wchar_t*[myCustomersCount];
или 3) просто вернуть wchar_t**
, так как вы не используете переданное значение ни для чего.
Еще одна определенная проблема: когда вы выделяете память для каждого имени, вам также нужно использовать оператор new[]
, потому что в противном случае вы выделяете место только для одного wchar_t
.
Наконец, потенциальная проблема. Вы не показываете, как именно этот код получает имя каждого клиента. Но если strName
указывает на память, которая повторно используется для каждого имени клиента, когда вы помещаете их все в свой массив, вам придется wstrcpy
каждое имя в массиве. Если этого не произойдет, вам не нужно выделять память для каждого Names[i]
, поскольку вы можете просто сохранить результат прямо в Names[i]
.
Последнее замечание: просто глядя на этот код, вы, похоже, столкнетесь с множеством проблем с управлением памятью, так как кажется, очень неясно, кто отвечает за выделение и освобождение памяти, которая, вероятно, собирается привести к утечкам памяти. Старайтесь изо всех сил держать ответственность за выделение и освобождение памяти в одном и том же месте, и вы уменьшите множество потенциальных головных болей - пусть вызывающие абоненты выделяют память перед вызовом функции, а вызывающий - освобождает память после завершения работы с этим.
/* changed */
wchar_t** GetCustomers( int *count)
{
//Logic to get customer count : Stored in int myCustomersCount
wchar_t **Names = new wchar_t*[myCustomersCount];
for (int i=0; i < myCustomersCount; i++ )
{
/* changed */
Names[i] = new wchar_t[MAX_NAME_SIZE];
}
//Logic to get customer names in wchar_t* strName = "Name1";
Names[0] = strName; /* possible wstrcpy needed here? */
*count = myCustomersCount;
/* changed */
return Names;
}
Редактировать
Если вы действительно абсолютно не можете изменить сигнатуру функции, единственное решение, которое я могу придумать, - это сгладить массив и использовать функции памяти C (вы также можете просто использовать длинные серии из new
s и delete
s, но почему бы не использовать realloc
, если это то, для чего оно предназначено, и вы управляете памятью, не используя другие функции C ++, такие как STL, в любом случае?):
GetCustomers( wchar_t **Names, int *count)
{
//Logic to get customer count : Stored in int myCustomersCount
size_t names_size = 0;
for (int i=0; i < myCustomersCount; i++ )
{
strName = ???; // whatever you use to get the next name
size_t old_names_size = names_size;
names_size += (wstrlen(strName) + 1) * sizeof(wchar_t); //+1 for NULL
*Names = realloc(*Names, names_size);
if (!*Names) {
// Memory allocation failed, log it, abort, do whatever
}
wstrcpy(Names[old_names_size], strName);
}
*count = myCustomersCount;
}
Обратите внимание, что это предполагает, что Name
уже инициализирован и указывает на память, где вы можете хранить wchar_t*
, так же, как исходная предполагаемая версия count
была инициализирована, и указывает на память, где вы можете хранить int
.