Я пытаюсь использовать библиотеку C, которая требует, чтобы я передавал динамически размещенные c-строки для функций, которые нужно изменить.Тем не менее, я хочу избежать использования операторов new / delete, потому что считаю, что лучше, если бы управление памятью осуществлялось скрытно библиотеками STL, а не мной.
Ниже я пытаюсь использовать std:: string (и векторы), чтобы решить эту проблему, и предварительно выделить их перед передачей в функцию C.Примеры с одной строкой (CChar, CVoid) работают, но я все еще не уверен, является ли это правильным способом, или даже если это безопасный (без ошибок) способ сделать это.Использование векторов, по-видимому, не работает вообще.
Я включил способ «C» делать то, что я хочу достичь как для строк, так и для векторов.
#include <string>
#include <iostream>
#include <vector>
// ----------------------------------------------------
// Example C library Code
void CChar(char* data, int len)
{
int i;
for (i = 0; i < len; ++i)
data[i] = 'A' + (i % 26);
}
void CVoid(void* data, int len)
{
char* d = (char*)data;
int i;
for (i = 0; i < len; ++i)
d[i] = 'Z' - (i % 26);
}
void CStrings(char** strings, int count, int lengths)
{
int i, j;
for (i = 0; i < count; ++i)
for (j = 0; j < lengths; ++j)
strings[i][j] = 'A' + ((i * j + i) % 26);
}
// ----------------------------------------------------
// C++ code
int main()
{
// Traditional way, using new/delete.
char* c = new char[11];
CChar(c, 10);
c[10] = '\0';
std::cout << c << std::endl; // ABCDEFGHIJ
delete [] c;
std::string s(10, '\0');
CChar(&s[0], 10);
std::cout << s << std::endl; // ABCDEFGHIJ
CVoid(&s[0], 10);
std::cout << s << std::endl; // ZYXWVUTSRQ
std::vector<std::string> v(5, std::string(10, '\0'));
// Traditional way with arrays of arrays.
char** cc = new char*[5];
for (int i = 0; i < 5; ++i)
{
cc[i] = new char[11];
cc[i][10] = '\0';
}
CStrings(cc, 5, 10);
for (int i = 0; i < 5; ++i)
{
std::cout << cc[i] << std::endl; // AAAAAAAAAA, BCDEFGHIJK, CEGIKMOQSU, DGJMPSVYBE, EIMQUYCGKO
delete [] cc[i];
}
delete [] cc;
// Doesn't compile
// CStrings(&v[0], 5, 10);
// for (int i = 0; i < 5; ++i)
// std::cout << v[i] << std::endl;
return 0;
}
Резюме: Isесть хороший способ использовать библиотеки STL в C ++, чтобы при попытке использовать библиотеки C мне не требовалось самостоятельно управлять ресурсами.
edit: Ошибка очистки массива массивов