我发现更新操作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通过创建我自己的(我不知道它是如何工作的...)来覆盖.
我的代码审查员已经指出地图的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作为我的内部容器,因为我想使用它快速且自我解释的索引功能.
我希望有人可以和我争论更多或站在我身边:)
特定
一个充满单词的字典,{in, july, den, dentist, best, ...}带有一些C++ API来访问它:boolean findWord(string word)或者string getNextWord(void)遍历它,
一些没有空格的输入字符串,例如:bestdentistinjuly......
产量
best dentist in july is... (基本上用给定字典的空格分隔非空格字符串)什么是解决它的最佳算法?
一个微妙但重要的问题是,是否有任何奇特的方法来解决无法到达的死胡同问题.例如,den并且dentist都是有效的词来剖析其余的字符串,其中一个可能只是一个死胡同.
对我来说,这似乎是一个贪婪的问题或动态编程可以解决的问题.
我知道EXIT_SUCCESS/ EXIT_FAILURE通常用于main()出口以指示程序的成功.
但它是否也用于(通常或建议)正常的函数返回?我正在尝试写一些"标准"代码,所以想知道我是否应该使用它们而不是0或-1 ..
char *crypt(const char *key, const char *salt);
Run Code Online (Sandbox Code Playgroud)
返回值:返回指向加密密码的指针.出错,NULL返回.
由于除非给出key和salt,否则返回值是未知的,这应该是动态分配的内存,但valgrind不同意.
在Linux中,如果创建了两个线程并且它们都在运行,当其中一个线程调用recv()或任何在没有数据可用时阻塞的IO系统调用时,整个过程会发生什么?
另一个线程会阻塞吗?我想这取决于如何实现线程.如果线程库在用户空间中并且内核完全不知道进程内的线程,则进程是调度实体,因此两个线程都被阻塞.
此外,如果其他线程因此而没有阻塞,那么它是否可以send()通过相同的套接字来阻止recv线程?双面打印?
有任何想法吗?
我知道溢出普通代码是可能的:
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) 嗨,我有一个关于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).
谢谢!
如何获取系统中当前的文件描述符数?
我知道如何获得最大值.
% sysctl kern.maxfiles
kern.maxfiles: 8232
Run Code Online (Sandbox Code Playgroud)
参考: