分配const char * const buffer

时间:2015-12-09 14:16:12

标签: c++ libpq

我在c ++应用程序中创建缓冲区时遇到问题。我被迫创建一个const char * const *缓冲区,以便我可以使用libpq的PQexecParams函数。

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

以下是重现问题的一些代码:当我为缓冲区分配大于2.5MB的任何内容时,我会获得STATUS_STACK_OVERFLOW异常(例如,运行程序并指定大小为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;
}

创建用于PQexecParams的大缓冲区(2.5MB)的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

你的代码正在做的是在堆栈上分配一大堆指针,这就是你得到堆栈溢出异常的原因。

在堆上分配缓冲区的正确方法是:

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

但是,我会遵循@BoBTFish的建议并使用:

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

您可以通过buffer.data()或获取第一个元素的地址来访问数据缓冲区:&buffer[0]。 Vector将在其析构函数中释放已分配的内存。