分配 const char* const 缓冲区时,C++ 应用程序崩溃

标签 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 的任何内容时(例如运行程序并指定大小为 2621440),我收到 STATUS_STACK_OVERFLOW 异常。

#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)的正确方法是什么?

最佳答案

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

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

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

但是,我会听从@BoBTFish 的建议,只使用:

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

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

关于分配 const char* const 缓冲区时,C++ 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34181012/

相关文章:

c++ - 使用容器中的第 n_th 个元素,但使用另一个键

c++ - 现代 Opengl 的 2D 形状坐标

c - 如何使用 libpq (PostgreSQL) 将 PGresult 转换为自定义数据类型

node.js - 安装 pg-native 时 gyp 失败

Lazarus Pascal 的 postgresql 客户端库 - 缺少 libpq.dll 错误

c++ - 使用成员访问运算符 (.) 初始化结构中的 char 数组

c++ - 在测试中检查对象的类型是公认的做法吗?

java - Linux下如何生成opencv-247.jar

postgresql - PQescapeLiteral 未定义?

c++ - 我应该如何处理 libpq for postgresql 中的错误