我正在尝试计算int []中的最大值。下面的程序崩溃了,但我不明白为什么。 Test
类是否存在问题?谢谢。
class Max {
int *max;
public:
Max() {
max = NULL;
}
~Max() {
if (max)
delete max;
}
void compute(int N[], int n) {
this->~Max();
max = new int(N[0]);
for (int i = 0; i < n; i++)
if (*max < N[i])
*max = N[i];
}
void print() {
cout << "Max= " << *max << endl;
}
};
class Test {
public:
static Max& getMax(int N[], int n) {
Max m;
m.compute(N, n);
return m;
}
};
void main() {
int N[] = { 8,9,7,8,10,6 };
Test::getMax(N, sizeof(N) / sizeof(int)).print();
}
答案 0 :(得分:2)
最好的方法是将std::vector
/ std::array
与std::max_element
一起使用。我建议先学习具有stl容器和算法的现代c ++,然后再学习低级功能。
但是您可以从这里学习代码中的错误:
使用nullptr
代替NULL
Max() {
max = nullptr;
}
不要调用析构函数
this->~Max();
不返回对局部变量的引用
static Max& getMax(int N[], int n) { //
Max m;
m.compute(N, n);
return m;
}
请勿使用using namespace std;
请记住为每个delete
调用new
,为每个delete[]
调用new []
。 (如果可能,请避免使用new
,new []
,delete
和delete[]
)
您不需要max
的指针。在您稍加使用代码后,int max;
也可以使用。
答案 1 :(得分:1)
您当然可以使用Import-Module "C:\Program Files\Microsoft Azure AD Sync\Bin\ADSync\ADSync.psd1"
和std::vector
,但是代码的真正问题(除了许多错误)是令人费解的。用C ++进行编程比编写要容易。
这里是直接编写相同代码的方法,此简单任务不需要任何类。
std::max_element
未经测试的代码。
答案 2 :(得分:0)
向量中的最大值
那不是向量。这是一个数组。整数向量称为std::vector<int>
。您可能应该使用一个。
void compute(int N[], int n) {
this->~Max();
此行之后,被称为*this
的对象正式是 dead 。除了取消分配内存或使用new位置在其尸体上构造另一个实例外,您不能对其进行任何合法操作。
您实际上所做的事-既不做任何事情-都是非法的和不道德的。
据我所知,在这里有一个指针(并重新/取消/分配它)甚至什么都没有实现。如果您只能编写int max;
并避免动态分配,则可以这样做。
static Max& getMax(int N[], int n) {
Max m;
m.compute(N, n);
return m;
}
返回对临时目录的引用也是非法的。要么
m
(如果要使动态分配正常工作,则需要编写适当的复制并移动构造函数和赋值运算符,尽管仅删除它会节省很多工作和错误)< / li>
Max
类耦合到std::cout
)。总而言之,我的推荐顺序是:
std::vector<int>
和std::max_element
如果您必须编写自己的版本,max
仍应是返回结果的函数,而不是将对象变异为...以存储结果的方法为以后?所以:
int compute_max(int const *n, int nlen) {
// handle corner cases
if (nlen < 1) return std::numeric_limits<int>::min();
int result = n[0];
for (int i = 1; i < nlen; i++)
if (result < n[i])
result = n[i];
return result;
}
如果您必须有一个有状态的Max
类(对我来说这仍然是很奇怪的设计),只需删除动态分配
std::unique_ptr<int>
原始指针的无论您喜欢哪种Max
的实现方式(并且我想强调的是,选项3&4是距离很远的第三和第四最佳选项,仅在非常罕见或人为的条件下使用),您必须 不返回对getMax()
中的局部变量的引用。显然,还是在其他任何地方。