2015-12-09 3 views
1

У меня возникли проблемы с созданием буфера в моем приложении C++. Я вынужден создать const char * const * buffer, чтобы я мог использовать функцию PQexecParams от libpq.С ++ приложение сбой при распределении const char * const buffer

PGresult *PQexecParams(PGconn *conn, 
        const char *command, 
        int nParams, 
        const Oid *paramTypes, 
        const char * const *paramValues, 
        const int *paramLengths, 
        const int *paramFormats, 
        int resultFormat); 

Вот код, чтобы воспроизвести проблему я получаю исключение STATUS_STACK_OVERFLOW когда я выделяю что-нибудь большее, чем 2.5MB для буфера (например, запустить программу и указать размер 2621440.

#include <iostream> 
#include <cstdlib> 
using namespace std; 

int main() { 
     cout << "Buffer size Testing" << endl; 
     cout << "==========================" << endl; 
     int size; 
     cout << "Size of buffer?" << endl; 
     cout << "Size: "; 
     cin >> size; 
     try { 
     const char * const *buffer[size]; 
     } catch (...){ 
       cout << "An error was encountered!" << endl; 
       exit(1); 
     } 

     return 0; 
} 

Что такое правильный способ создать большой буфер (2.5Mb) для использования с PQexecParams?

+0

['std :: vector buffer (size);'] (http://en.cppreference.com/w/cpp/container/vector) Использование 'buffer.data()' в качестве указателя. И обратите внимание, что поскольку ваш является буфером 'const char', как вы когда-либо ожидали, что сможете сохранить значения? – BoBTFish

+1

Не добавляйте теги для несвязанных языков. – Olaf

+0

Возможный дубликат [Seg Fault при инициализации массива] (http://stackoverflow.com/questions/3815232/seg-fault-when-initializing-array) –

ответ

2

Что ваш код делает это выделение большой массив указателей на стеке, поэтому вы получите исключение переполнения стека.

Правильный способ выделения буфера на куче будет:

char* buffer = new char[size]; // add consts where you need them 

Однако я хотел бы последовать совету из @BoBTFish и просто использовать:

std::vector<char> buffer(size); 

Вы можете получить доступ к буфер данных либо buffer.data() или путем адресации первого элемента: &buffer[0]. Вектор освободит выделенную память в своем деструкторе.