小编Fig*_*igo的帖子

C++ std :: set update很乏味:我无法更改元素

我发现更新操作std::set很繁琐,因为cppreference上没有这样的API .所以我现在做的是这样的:

//find element in set by iterator
Element copy = *iterator;
... // update member value on copy, varies
Set.erase(iterator);
Set.insert(copy);
Run Code Online (Sandbox Code Playgroud)

基本上迭代器返回的Set是a const_iterator,你不能直接改变它的值.

有一个更好的方法吗?或者也许我应该std::set通过创建我自己的(我不知道它是如何工作的...)来覆盖.

c++ stl set

66
推荐指数
5
解决办法
2万
查看次数

stl map operator []不好?

我的代码审查员已经指出地图的operator []的使用非常糟糕并导致错误:

map[i] = new someClass;    // potential dangling pointer when executed twice
Run Code Online (Sandbox Code Playgroud)

要么

if (map[i]==NULL) ...      // implicitly create the entry i in the map 
Run Code Online (Sandbox Code Playgroud)

虽然我理解读取API之后的风险insert(),因为它检查重复是更好的,因此可以避免悬空指针发生,我不明白,如果处理得当,为什么[]不能使用呢?

我选择map作为我的内部容器,因为我想使用它快速且自我解释的索引功能.

我希望有人可以和我争论更多或站在我身边:)

c++ stl map operators

13
推荐指数
2
解决办法
2万
查看次数

用字典解析字符串的算法

特定

  • 一个充满单词的字典,{in, july, den, dentist, best, ...}带有一些C++ API来访问它:boolean findWord(string word)或者string getNextWord(void)遍历它,

  • 一些没有空格的输入字符串,例如:bestdentistinjuly......

产量

  • best dentist in july is... (基本上用给定字典的空格分隔非空格字符串)

什么是解决它的最佳算法?

一个微妙但重要的问题是,是否有任何奇特的方法来解决无法到达的死胡同问题.例如,den并且dentist都是有效的词来剖析其余的字符串,其中一个可能只是一个死胡同.

对我来说,这似乎是一个贪婪的问题或动态编程可以解决的问题.

c++ algorithm parsing dictionary

11
推荐指数
1
解决办法
2143
查看次数

有意义的函数返回值的常用方法是什么?

我知道EXIT_SUCCESS/ EXIT_FAILURE通常用于main()出口以指示程序的成功.

但它是否也用于(通常或建议)正常的函数返回?我正在尝试写一些"标准"代码,所以想知道我是否应该使用它们而不是0或-1 ..

c return-value

6
推荐指数
2
解决办法
4279
查看次数

为什么crypt()函数没有内存泄漏?

来自crypt(3) - Linux手册页:

char *crypt(const char *key, const char *salt);
Run Code Online (Sandbox Code Playgroud)

返回值:返回指向加密密码的指针.出错,NULL返回.

由于除非给出key和salt,否则返回值是未知的,这应该是动态分配的内存,但valgrind不同意.

c crypt

5
推荐指数
1
解决办法
690
查看次数

当一个线程被阻塞时,其他线程会发生什么?

在Linux中,如果创建了两个线程并且它们都在运行,当其中一个线程调用recv()或任何在没有数据可用时阻塞的IO系统调用时,整个过程会发生什么?

另一个线程会阻塞吗?我想这取决于如何实现线程.如果线程库在用户空间中并且内核完全不知道进程内的线程,则进程是调度实体,因此两个线程都被阻塞.

此外,如果其他线程因此而没有阻塞,那么它是否可以send()通过相同的套接字来阻止recv线程?双面打印?

有任何想法吗?

c multithreading

5
推荐指数
1
解决办法
3071
查看次数

扫描溢出("%8s",字符串)?

我知道溢出普通代码是可能的:

char string [9];

scanf("%s",string).

但是有可能溢出scanf("%8s",字符串)?图8只是一个例子.

我知道"%8s"的作用类似于分隔符,但我也注意到当我输入超过8个字符的字符串时,程序将因以下原因而终止:

*堆栈粉碎检测*:./a.out终止

======= Backtrace:=========

...

显然,有一个标志可以检测GCC默认启用的堆栈粉碎.由于这是一个堆栈粉碎,我的猜测是仍然可以溢出并执行任意代码.

与正常溢出相反,会破坏scanf的调用者("%s"),如果scanf("%8s")可能溢出,它将在scanf函数内溢出,以便当scanf尝试返回时,获得控制权.

但是scanf是一个需要模式切换的系统调用(从用户模式切换到内核模式),并且在内部它会调用诸如read之类的东西到stdin等.所以不确定我们是否可以在内核模式或其他东西溢出.

欢迎评论!!

更新>>

在上面的例子中假设了char字符串[9].以下实际代码中的字符串[8].

问题实际上是关于安全扫描("%8s")和GCC流产之间由于堆栈粉碎而看似矛盾的故事.

简化代码:

void foo(pass some pointer) {
char input[8];
int input_number = 0;

while (1) { // looping console
   printf some info;
   scanf("%8s", input);

   input_number = atoi(input);

   if ((strlen(input) == 1) && (strncmp(input, "q", 1) == 0)) {
       input_number = -1;
   }
   switch (input_number) {
       case -1: to quit the console if input = 'q';
       default: to print info that pointer refers …
Run Code Online (Sandbox Code Playgroud)

c scanf buffer-overflow

4
推荐指数
1
解决办法
1万
查看次数

gcc堆栈优化

嗨,我有一个关于gcc(或g ++)可能的堆栈优化的问题..

FreeBSD下的示例代码(这里的UNIX差异是否重要?):

void main() {
   char bing[100];
   ..
   string buffer = ....;
   ..
}
Run Code Online (Sandbox Code Playgroud)

我在gdb中找到的这个程序的coredump是bing的地址实际上低于那个缓冲区(即&bing [0] <&buffer).

我认为这完全与教科书中的相反.是否有一些编译器优化以这种方式重新组织堆栈布局?

这似乎只是可能的解释,但我不确定..

如果你感兴趣的话,coredump是由于bing缓冲区溢出缓冲区(但这也确认了&bing [0] <&buffer).

谢谢!

c++ optimization gcc g++

4
推荐指数
2
解决办法
799
查看次数

2
推荐指数
1
解决办法
3626
查看次数