【问题标题】:arrays of void pointers空指针数组
【发布时间】:2011-07-25 17:05:30
【问题描述】:

同样,这个问题也源自“Thinking in C++”Chapter7, Q#7。我相信Stack头文件应该改成Stack.h

        #ifndef STACK_H
        #define STACK_H

        class Stack {
          struct Link {
            void* data;
            Link* next;
            Link(void* dat, Link* nxt);
            ~Link();
          }* head;
        public:
          Stack();
          Stack(void* arr[], int size);
          ~Stack();
          void push(void* dat);
          void* peek();
          void* pop();
        };

以及 Stack.cpp 中 Stack::Stack(void* arr[], int size) 的实现,我相信可能是这样的:

       Stack::Stack(void* arr[], int size)
       {
         for (int i=0; i<size; i++)
          {
            push(arr[i]);
          }
       }

但是,在主测试文件 StackTest.cpp 中,如何将字符串数组的地址传递给此构造函数?这是我想出的:

          #include "Stack.h"
          #include "require.h"
          #include <iostream>
          #include <string>
          using namespace std;

          int main() {

            string tst_arr[] = {"hi 1", "hi 2", "hi 3"};
            Stack string_arr((void**)tst_arr, 3);
            string* s;
            while((s = (string*)string_arr.pop()) != 0) {
              cout << *s << endl;
              delete s;
            }
          } 

但它有一些分段错误。我能想到的是将 Stack::Stack(void* arr[], int size) 更改为 Stack::Stack(string arr[], int size),但是它不满足问题要求。 Stack 的目的是存储通用对象,例如字符串。我相信我仍然很难理解 void* 指针和指针数组的概念以及字符串数组到 void* 数组等之间的变化......任何人都可以帮我解决这个问题吗?非常感谢!!

【问题讨论】:

  • (void **)tst_arr 在技术上是错误的,尽管它可能不是问题的根源。
  • 呃,我想说放弃这种精神错乱。无论如何,您不会以这种方式学习任何有用的东西(void* 根本不应该在 C++ 中使用)。首先学习模板,然后尝试编写你的堆栈(然后再一次,不要在实际代码中使用它——改用标准库容器)。
  • “用 C++ 思考”显然是用词不当。这家伙用 C 语言思考。
  • 每次你以void** 结束时,你就知道你很多了。别管它!

标签: c++ arrays pointers stack void-pointers


【解决方案1】:

你的 Stack 构造函数请求一个关于东西的指针数组,你给它一个对象数组。作为奖励,我给你适当的主要功能和释放内存^^

#include <cstdlib>
// --- Includes your stuffs ---

using namespace std;

int main(int argc, char* argv[]) {
  string* tst_arr[] = new string[3];
  tst_arr[0] = new string("hi 1");
  tst_arr[1] = new string("hi 2");
  tst_arr[2] = new string("hi 3");
  Stack string_arr((void**)tst_arr, 3);

  // --- Do your stuffs ---

  for(int i =0; i < 3; ++i)
    delete tst_arr[i];
  delete[] tst_arr;

  return EXIT_SUCCESS;
}

【讨论】:

  • 请不要在家里尝试这个孩子! :-) 正因为如此,所以有一个 std::stack。
  • 感谢您的回复,相信数组初始化应该改成:string* tst_arr[3] = { new string("hi 1"), new string("hi 2"), new字符串(“嗨 3”)};否则,编译器会给你一些如上所述的错误。为了释放内存,我还在研究它,因为 Stack->pop 已经释放了指针,根据我的初始化,我认为不需要 delete tst_arr[i] 或 delete[] tst_arr ,对吧?跨度>
  • 对 Bo:假设你在面试中被要求自己实现一个堆栈,你能说“有 std::stack 存在,孩子,你不知道吗?”而且我认为这是有道理的,即使轮子确实存在,也一定有人知道如何制造它们,对吧?
  • 所以如果你的pop函数调用delete,那么是的,不需要像我在sn-p上那样删除。但总的来说,将作业分开是很好的,这里是内存管理堆栈。通过在您的 pop 方法中执行 delete,您的堆栈也起到了内存管理的作用。您可能需要堆叠指针而不删除它们,这种情况经常发生,例如在处理树或图形时......
猜你喜欢
  • 2013-09-07
  • 2013-04-13
  • 2011-12-21
  • 1970-01-01
  • 2015-04-28
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多