以下C++代码给出了一些内存分配错误
The following C++ code gives some memory allocation error
我写了下面的代码。它在某些输入上运行良好,但在其他一些输入上显示错误。
例如,当我尝试输入:
10000 2
1 2
3 4
当我输入第二行输入时,它会显示以下错误(甚至没有等待第三行)
a.out: malloc.c:2395: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
Aborted (core dumped)
可能是什么原因?
#include <iostream>
#include <list>
#include <cmath>
using namespace std;
void addEdge(list<int> *adj, int a, int b)
{
adj[a].push_back(b);
}
int count = 1;
int dfsVisit(int i, bool *visited,list<int> *adj)
{
visited[i] = true;
list<int> ::iterator k;
for(k=adj[i].begin(); k!=adj[i].end();k++)
{
if(!visited[*k])
{
count ++;
dfsVisit(*k, visited, adj);
}
}
return count;
}
int main()
{
list<int> *adj;
long int n,i,j,a,b,m=0,k;
long int arr[1000000];
cin>>n>>i;
bool *visited = new bool;
for(j=0;j<n;j++)
{
visited[j] = false;
}
adj = new list<int>[n];
for(j=0;j<i;j++)
{
cin>>a>>b;
addEdge(adj, a,b);
}
for(k=0;k<n;k++)
{
if(visited[k]==false)
{
count = 1;
arr[m] = dfsVisit(k, visited, adj);
m++;
}
}
/*for(k=0;k<m;k++)
{
cout<<arr[k];
}*/
long int ans = 1;
if(m>1)
{
for(k=0;k<m;k++)
{
ans = ans * arr[k];
}
}
if(m==1)
{
ans = 0;
}
cout<<ans;
}
您刚刚将 visited 声明为指针,但只为其分配了一个内存槽。
bool *visited = new bool;
for(j=0;j<n;j++)
{
visited[j] = false;
}
这更多的是关于如何设置代码样式以及根据语言提供的工具,使用哪些 c++ 功能来避免某些问题。
C++确实比 C 更不容易出错,应该利用它。
#include <iostream>
#include <list>
#include <cmath>
#include <vector>
#include <cstddef>
using namespace std;
void addEdge(std::vector<std::list<std::size_t>>& adj,
std::size_t a, std::size_t b)
{
adj.at(a).push_back(b);
}
void dfsVisit(std::size_t i, std::vector<bool>& visited,
std::vector<std::list<std::size_t>> const& adj, std::size_t& count)
{
visited[i] = true;
for (auto k : adj.at(i))
{
if (!visited.at(k))
{
++count;
dfsVisit(k, visited, adj, count);
}
}
}
int main()
{
// initialize all variables and make the scope as small as possible
std::size_t ni{}, ii{};
// try to read n and i from cin
// without the if you never know that you'll actually have valid input
if (std::cin >> ni >> ii)
{
// const refs to block changes
auto const& n = ni;
auto const& i = ii;
// dynamic, contiguous memory ? -> std::vector !
// create visited vector
// no need to loop: we can make them all false here
auto visited = std::vector<bool>(n, false);
// create adj vector
auto adj = std::vector<std::list<std::size_t>>(n);
// you don't need arr on the stack so don't put it there
std::vector<std::size_t> arr;
// we know we'll have at max n entries in arr
arr.reserve(n);
// add edges
for (std::size_t j = 0u; j < i; ++j)
{
std::size_t a{}, b{};
if (std::cin >> a >> b)
{
addEdge(adj, a, b);
}
// TODO: else clause when input fails...
}
std::size_t count{};
for (std::size_t k = 0u; k < n; ++k)
{
if (!visited[k])
{
std::size_t count = 1u;
dfsVisit(k, visited, adj, count);
// we know k < n and m < k since we increment at max once
// so no at but operator[]
arr.push_back(count);
}
}
std::size_t ans = 1u;
auto const m = arr.size();
if (m > 1u)
{
for (std::size_t k = 0; k < m; ++k)
{
ans = ans * arr[k];
}
}
else if (m == 1)
{
ans = 0u;
}
std::cout << ans;
}
// TODO: else clause when input fails...
}
相关文章:
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配