OCCI - setDataBuffer +矢量
问题描述:
试图尽量减少线的数量为一个OCCI阵列由存储包含char缓冲区到载体一个结构取,以下代码:OCCI - setDataBuffer +矢量<struct>
struct Columns { char buffer[1000][300]; };
int i = 1;
Columns col;
ub4* ub = NULL;
results->setDataBuffer(i++, col.buffer, OCCI_SQLT_STR, sizeof(col.buffer[ 0 ]), ub);
vec.push_back(col);
cout << "Before, vec size: " << vec.size() << "\n"; // prints 1, as expected
while (results->next(1000)) {
for (size_t j = 0; j < results->getNumArrayRows(); ++j) {
cout << vec[ 0 ].buffer[ j ] << endl;
}
现在出于某种原因,这并不工作。但是,如果不是使用col.buffer,我创建了一个字符缓冲区[1000] [300],然后把它扔进setDataBuffer,然后在cout部分执行: cout < < buffer [j] < < endl;
工作得很好。所以我不确定我在搞什么?
char缓冲区与col.buffer完全相同,是不是?
我不认为它很重要,但结构列在头文件中定义。
答
我猜setDataBuffer
罢了,你通过,那么你将其推入载体缓冲区作为参数(这是col.buffer这里),所以一个新的struct Columns
由vec
分配并复制col
内容。现在col
和vec[0]
是两个不同的对象。
然后你调用一些方法来填充你首先传递给它的缓冲区。所以它填充col.buffer
,你读vec[0].buffer
,这是不同的,因为它们是2个不同的对象。
一种解决方案将代替vec.emplace_back();
创建一个实例,然后将vec[0].buffer
传递给setDataBuffer
。但要注意向量中元素的地址。如果修改矢量(添加或删除元素),则可以重新分配其内容,并且元素地址可能会更改。
因此,push_back不会复制字符缓冲区的内容?这很令人困惑,它上面的文档说它会复制,认为它会复制一切。 emplace_back解决方案,但是,谢谢。 – user1324674
好吧,它复制它,但一旦它被复制,它是另一个对象,只有相同的内容。也许你曾经用一种不同的语言来开发,比如默认使用对象作为参考的JS的C#。这意味着如果你拷贝一个名为'b'的对象'a'并修改'b','a'的内容也会被修改。如果你想要一个真正的副本,你需要克隆它。在C/C++中它不同,它默认使用值。这意味着如果你做'a = b','a'是'b'的克隆,如果你修改其中一个,另一个不被修改(除非你明确定义'a'作为参考, int &a = b;') – Ludonope
那么究竟发生了什么?原来的范围/取代然后poof,数据已经没有了?但是,使用矢量似乎不适用于setdatabuffer函数。我不太明白为什么,你会碰巧知道吗?它适用于1列,但如果有超过1列,它会崩溃。 – user1324674