【发布时间】:2016-09-12 14:18:14
【问题描述】:
我不认为自己是编程新手,但我在六个月的大部分时间里一直在努力理解向量。
我尝试在“生产”代码中使用向量,但它似乎从来没有达到我的预期。这个例子是我遇到的许多问题之一,正如标题中所述,Vectors 在离开 while 循环后似乎神秘地丢失了数据。这可能归结为我只是使用错误的向量,但我想我的过程至少有点合理。正如您将注意到的,这是一个对象向量,这也可能是该问题的关键。
在我制作的这个例子中,一个带有随机字符的 char 指针被添加到向量中,正好十次。每次都会擦除 char 指针的内容并添加新内容以确保数据的唯一性。离开循环并开始另一个循环以打印出向量的内容后,刚刚添加到向量中的数据不再存在。为什么?
此外,从我看到的示例来看,向量的初始化是非标准的,但似乎是让向量在不崩溃的情况下工作的唯一方法。
抱歉我的格式不好,代码块中的样式与我的代码格式不完全一样(括号间距有点搞砸了)提前谢谢!
#include <stdio.h>
#include <vector>
#include <stdlib.h>
int main( int argc, char * argv[ ] ) {
std::vector<char *> avector( 0 );
avector.reserve( 400 );
int counter = 0;
char * place;
bool ok;
Back:
if( counter == 10 ) {
counter = 0;
while( counter != 10 ){
printf( "Element %d: %s\n", counter, avector.at( counter ) );
++counter
}
ok = false;
}
while( counter != 10 ) {
ok = true;
place = (char *)malloc( 10 * sizeof( char ) );
*place = (char)( ( rand( ) % 26 ) + 65 );
printf("Pre-placement, element %d: %s\n", counter, place );
avector.push_back( place );
printf("Post-placement element %d: %s\n", counter, avector.at( counter ) );
free( place );
++counter;
}
if( ok == true ) {
goto Back;
}
exit( 0 );
}
【问题讨论】:
-
‘这是一个对象向量’ 呃,不。它是
char*的向量。 -
向量不会“丢失”数据。你删除它。您使用“malloc”创建一个内存块,然后将其地址推送到向量中(注意。您不复制内存,只是将地址存储在那里),然后您删除内存与
free。在我看来,你应该更多地开始学习指针而不是向量(或者在 c++ 中停止使用 malloc/free。这不是 C) -
goto Back;好的。我不想刻薄。我相信你在编写这段代码时是出于好意。但是为了图灵的爱,为什么你会写goto声明???? -
您的代码/设计的用例(现实生活中的问题)是什么?您真的需要实施这种方法吗?
-
@Xirema 不应该是“为了 Dijkstra 的爱”吗?
标签: c++ memory vector allocation