如何解决类和代码抛出错误以及奇怪的意外行为 什么是编译器错误如果代码编译,将会发生什么解决方案无人回答
我正在做一个小项目。我遇到了一些问题,现在已经尝试了好几个星期了。但是,我最终决定来到SO,并将其发布在这里。我正在尝试让我的两个功能正常工作:
Remove(...)
和SearchWithName(...)
,我正在使用基于C ++ Range的for循环。但是,Remove不会删除Array中Employee的指针。我得到一些内存抛出错误。出于某种原因,即使名称匹配或不匹配,我仍然会匹配。奇怪。我正在尝试使其部分匹配或完全匹配。
此处的代码为:https://onlinegdb.com/B1Whf_eUP
int main(){
EmployeeArray* empArr = new EmployeeArray[2]
{
Employee("Richard Johnson","1801 E 10th St Pueblo,CO 81001"),Employee("David Paras","15 Spring St Rear Peabody,MA 01960"),}
std::cout << (empArr->SearchWithName("lol") != NULL ? "Employee found!" : "This employee couldn't be found!") << std::endl;
empArr->remove(*(Employee("Richard Johnson",CO 81001"))));
return 0;
}
错误:
/ usr / sbin / ld:/tmp/ccOVptof.o:在函数main': jdoodle.cpp:(.text+0x90): undefined reference to
中的Employee :: Employee(std :: __ cxx11 :: basic_string
解决方法
什么是编译器错误
您没有定义Employee(std::string name,std::string address)
。您只声明了这一点。 std::__cxx11::basic_string<char,std::char_traits,std::allocator>
看起来很虚假,您可以将它改称为std::string
。
如果代码编译,将会发生什么
您的EmployeeArray::employee
指向动态分配的数组:
employee --> +---+---+---+---+---+-----+
| 0 | 1 | 2 | 3 | 4 | ... |
+---+---+---+---+---+-----+
| E | E | E | E | E | ... |
+---+---+---+---+---+-----+
当您进行for循环并找到要删除的员工时,您的ee
如下所示:
employee --> +---+---+---+---+---+-----+
| 0 | 1 | 2 | 3 | 4 | ... |
+---+---+---+---+---+-----+
| E | E | E | E | E | ... |
+---+---+---+---+---+-----+
^
|
ee
您可能希望Employee
和ee
指向删除,而其他元素移到最前面。
但是,delete
这样的指针没有任何意义。 C ++数组几乎是愚蠢的,没有您想象的那么聪明。实际上,根据cppref,您所做的是C ++中的未定义行为:
::(optional) delete expression
(1)
::(optional) delete[] expression
(2)
销毁一个由new表达式创建的非数组对象
销毁由new []-表达式创建的数组
对于第一种(非数组)形式,表达式必须是指向对象类型的指针或上下文可隐式转换为此类指针的类类型,并且其值必须为null或由以下项创建的非数组对象的指针new表达式,或指向由new表达式创建的非数组对象的基础子对象的指针。如果expression是其他任何东西,包括它是通过new-expression的数组形式获取的指针,则行为是不确定的。
对于第二种(数组)形式,表达式必须是空指针值或以前由new-expression数组形式获得的指针值。如果表达式是其他任何东西,包括它是通过new-expression的非数组形式获得的指针,则行为是不确定的。
C ++编译器会将您的delete
视为破坏Employee
指向的ee
并取消分配该Employee
的内存的尝试。由于您的EmployeeArray::employee
不是由单个new
创建的,而是由new[]
创建的数组元素,因此delete
可能无法成功销毁该对象并取消分配内存。
未定义行为表示,如果这样做,可能会发生任何事情。您可能会看到错误,看到异常,看到核心转储,看到任何错误但得到错误的结果,或者一切正常,而无需打扰。因此,未定义的行为非常难以调试,应尽力避免。
解决方案
如果坚持使用new[]
手动创建数组,则可以使用new Employee*[]
创建指针数组。然后,使用Employee
创建的new Employee()
s手动分配给每个指针。就像
employee --> +---+---+---+---+---+-----+
| 0 | 1 | 2 | 3 | 4 | ... |
+---+---+---+---+---+-----+
| P | P | P | P | P | ... |
+---+---+---+---+---+-----+
您将可以delete
单个元素(不过,您需要将剩余的指针手动向左移动,delete
不会为您处理)。
无人回答
您可以使用std::vector
来存储数据,而不必使用std::find_if
/ std::remove_if
来进行数据操作,而不是处理脏内存。
要优雅地删除std
容器中的元素,可以使用std::remove_if
+ std::vector::erase
组合。 here是一个例子。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。