- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在做一个 C++ 家庭作业,其中我们必须构建一个单向链表的哈希表。我已经在 Mac 上编写了我的代码 - 它编译得很好并且完美地生成了预期的输出。但是,当我在 Linux 中运行该程序时,出现段错误(核心已转储)。使用 gdb 调试时,我收到消息
Program received signal SIGSEGV, Segmentation fault.
__strcmp_sse2 () at ../sysdeps/x86_64/multiarch/../strcmp.S:210
210 ../sysdeps/x86_64/multiarch/../strcmp.S: No such file or directory.
我阅读了本网站上其他发布的问题,在这种情况下 gdb 具有误导性,并且该问题与“strcmp”函数无关。但是,我看不出我的代码中的问题出在哪里。如果有人能指出我正确的方向,将不胜感激。 TIA。
//string_set.cpp
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "string_set.h"
using namespace std;
string_set::string_set() {
for (int i = 0; i < HASH_TABLE_SIZE; i++) { //initializing empty hash table
hash_table[i] = NULL;
} //end for
iterator_index = 0;
iterator_node = hash_table[iterator_index];
}
void string_set::add(const char *s) {
int hash_val = hash_function(s);
if (contains(s) == 1) {
throw duplicate_exception();
} //end if
node *a = new node;
if (a==NULL) {
throw memory_exception();
} //end if
a->s = new char[strlen(s) + 1];
if (a == NULL) {
delete a;
throw memory_exception();
} //end if
strcpy(a->s, s);
a->next = hash_table[hash_val];
hash_table[hash_val] = a;
if (contains(s) == 0) {
throw memory_exception();
} //end if
else {
reset();
} //end else
}
void string_set::remove(const char *s) {
if (contains(s) == 0) {
throw not_found_exception();
} //end if
int hash_val = hash_function(s);
node *prev = new node;
prev = hash_table[hash_val];
node *ptr = new node;
ptr = hash_table[hash_val];
while (strcmp(ptr->s, s) != 0) { //
prev = ptr;
ptr = ptr->next;
} //end while
if (prev == ptr) { //if node to be deleted is first in list
hash_table[hash_val] = ptr->next;
} //end if
delete ptr->s;
prev->next = ptr->next;
delete ptr;
reset();
}
int string_set::contains(const char *s) {
int hash_val = hash_function(s);
node *ptr = new node;
ptr = hash_table[hash_val];
while (ptr != NULL) {
if (strcmp(s, ptr->s) == 0) { //
delete ptr;
return 1;
} //end if
else {
ptr = ptr->next;
} //end else
} //end while
return 0;
}
void string_set::reset() {
iterator_index = 0;
iterator_node = hash_table[iterator_index];
}
const char *string_set::next() {
if (iterator_node != NULL) {
char copy[strlen(iterator_node->s) + 1];
strcpy(copy, iterator_node->s);
iterator_node = iterator_node->next;
return copy;
} //end if
while (iterator_index < HASH_TABLE_SIZE - 1) {
while (iterator_node == NULL) {
++iterator_index;
iterator_node = hash_table[iterator_index];
if ((iterator_index == HASH_TABLE_SIZE - 1) && (iterator_node == NULL)) {
return NULL;
}
} //end nested while
char copy[strlen(iterator_node->s) + 1];
strcpy(copy, iterator_node->s);
iterator_node = iterator_node->next;
return copy;
} //end while
return NULL;
}
string_set::~string_set() {
reset();
node *ptr = new node;
ptr = iterator_node;
while (ptr != NULL) {
delete ptr->s;
next();
ptr = iterator_node;
} //end while
delete ptr;
}
int string_set::hash_function(const char *s) {
int sum = 0;
for (unsigned int ind = 0; ind < strlen(s); ind++) { //summing elements in string s
sum += s[ind];
sum = sum % HASH_TABLE_SIZE;
} //end for
return sum % HASH_TABLE_SIZE;
}
字符串设置.h
using namespace std;
class string_set {
public:
/*Purpose
initialize the set to contain no elements
* Preconditions
none
* Exceptions
none
*/
string_set();
/*Purpose
* add s to the set
* if s is successfully added, reset the iterator
* Preconditions
* s is a legal string
* Exceptions
* if s is already present then throw duplicate_exception
* else if s there is not enough memory to add s then throw memory_exception
*/
void add(const char *s);
/*Purpose
* remove s from the set
* if s is successfully removed, reset the iterator
* Preconditions
* s is a legal string
* Exceptions
* if s is not present then throw not_found_exception
*/
void remove(const char *s);
/*Purpose
* return 1 if s is in the set and 0 otherwise
* Preconditions
* s is a legal string
* Exceptions
* none
*/
int contains(const char *s);
/*Purpose
* reset the iterator to the first element
* Preconditions
* none
* Exceptions
* none
*/
void reset();
/*Purpose
* return a pointer to the next set element
* return NULL if no more elements remain
* Preconditions
* none
* Exceptions
* none
*/
const char *next();
/*Purpose
* delete all dynamically allocated memory
* Preconditions
* none
* Exceptions
* none
*/
~string_set();
private:
/*Purpose
* return the hash value h associated with s
* h must consist of: (sum of the characters in s) mod HASH_TABLE_SIZE
* Preconditions
* s is a legal string
* Exceptions
* none
* Examples
* hash_function("a") returns 97
* hash_function("ab") returns 95
* hash_function("ba") returns 95
* hash_function("") returns 0
*/
int hash_function(const char *s);
enum {HASH_TABLE_SIZE = 100};
class node {
public:
char *s;
node *next;
};
// hash_table[i] is the head of a linked list of nodes
node *hash_table[HASH_TABLE_SIZE];
// iterator position
int iterator_index; // index in hash_table
node *iterator_node; // node in hash_table[iterator_index];
};
class duplicate_exception { };
class memory_exception { };
class not_found_exception { };
最佳答案
contains
函数中的这些代码行:
if (strcmp(s, ptr->s) == 0) { //
delete ptr;
将删除您刚刚找到的节点的内存,当您稍后尝试使用该节点时会导致未定义的行为。
在您的代码中的几个地方,您为指针分配一个新节点,然后立即将指针指向不同的位置 - 这将导致内存泄漏,并可能导致您删除您不希望删除的内容。
node *ptr = new node;
ptr = hash_table[hash_val];
应该是
node *ptr = hash_table[hash_val];
然后就不需要相应的delete
(除非您实际上要删除该节点)。
关于c++ - Linux 中的段错误,在 Mac OS 上工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32835448/
自从我 faced an issue由于背景图片对于不同分辨率的内容来说太短,我尝试将背景分成 3 部分并自动拉伸(stretch)中间部分以相应地填充顶部和底部图像之间的空间。不幸的是我没能在 CS
我从去年开始就在我的程序中运行这个函数(Linux 和 Windows)。 现在我需要实现一个新功能,我的新构建不再运行。 我还有其他使用 POST 的 CUrl 函数,结果是一样的:没问题,但我的
在评估函数应用方面,Haskell 是只支持普通降阶还是也支持应用降阶?我是否认为正常顺序是 Haskell 惰性的原因? 最佳答案 GHC 运行时不使用术语缩减策略,因为那会非常低效。事实上,GHC
怎么来的multi使用多处理池对多个“进程”上的数据进行分段和处理的函数比仅调用 map 慢(8 秒)。功能(6 秒)? from multiprocessing import Pool import
假设我正在渲染一个 3d GL_TRIANGLE。该对象需要 3 个顶点才能定义:A、B、C。我将此类数据放入缓冲区并通过 glVertexAttribPointer 将其绑定(bind)到着色器。
我有一个字体的三个文件,普通的,粗体的和浅色的。由于 font-weight:light 不存在,我该如何在 font-face 上设置 light 呢? 顺便问一下,font-weight:ligh
我是 C 的新手,我似乎无法弄清楚什么似乎是一个非常简单的指针问题。我的程序将行号添加到文件中。它逐行读入文件,然后在每行的开头添加一个行号。它在每个文件上都可以正常工作,如下所示: soccer@s
我有以下代码,我不确定为什么当它命中 Myclass 的析构函数时我会收到堆损坏检测错误。我相信我正在正确地释放内存?? #include #include using namespace std
有什么方法可以将“正常”数学符号解释为逆波兰符号 (RPN)..? 例如1) 2 + 3*4 - 1 = 234*+1-2) 5 (4-8) = 548- 你可以假设遵循 BODMAS 规则并且必须首
http://www.ergotopia.de/ergonomie-shop/ergonomische-kissen/orthopaedisches-sitzkissen的手机页面应该看起来像右边(检
我正在 Phonegap/Cordova 中构建一个应用程序。应用目前相当简单,但确实需要网络状态和地理定位插件才能工作。 到目前为止,我已经在 Android 上开发了该应用程序(目前它仅由一些基本
我一整天都在做这个,但没有运气 我设法在一行 TfidfVectorizer 中消除了问题 这是我的工作代码 from sklearn.feature_extraction.text import C
也许有人看到一个错误,问题是当我按btn2 (button 2)和btn3 (button 3)应用程序crashes时,但操作仍然有效,即video正在运行并且PDF打开,而button 1正常工作
我正在开发一个应用程序。它的第一页是登录屏幕。成功登录后,我想将用户带到选项卡式 Activity 。我怎样才能在安卓中做到这一点?谢谢 最佳答案 在 Android 中,启动 Activity 是通
我不确定我在这里做错了什么。 :normal! I### 当我对一个单词执行此命令时,我想要的最终结果是: ### word 但是我得到了这个: ###word 最佳答案 Vim 的 :normal是
我必须将 2 个静态矩阵发送到分配动态矩阵的函数,将矩阵 1 乘以矩阵 2,并返回新矩阵的地址。请注意,COMM 很常见。 我尝试删除 free_matrix 行,它工作正常。 void main()
我在我的一个项目中使用 Gnome libglib 并遇到了一个奇怪的错误。我可以输入 GList 的元素数量看起来仅限于 45 个。在第 45 个元素处,它给出了此错误 40 counter 41
我正在尝试获取“顶级”HWND 的尺寸。即,我想要 Firefox/Windows 资源管理器等的主 HWND 的当前尺寸。窗口。如果窗口最小化, GetWindowRect() 将不起作用。 Get
相同的标题:什么是索引 - 正常 - 全文 - 唯一? 最佳答案 普通索引用于通过仅包含行数据的切片或散列来加速操作。 全文索引向数据库的全文搜索 (FTS) 引擎指示它应该将数据存档在给定字段中,以
我正在使用 EnumParser来自 here它在 VC++ 中编译得很好,但是使用 gcc 我有这样的错误: ./Terminator.o: In function `EnumParser::Enu
我是一名优秀的程序员,十分优秀!