diff --git a/src/common_test.h b/src/common_test.h
index afe0c0f..4fcf44d 100644
--- a/src/common_test.h
+++ b/src/common_test.h
@@ -33,24 +33,21 @@
 class ScratchFile {
  public:
   ScratchFile() {
-    std::string filename_template;
-    filename_template = getenv("ANDROID_DATA");
-    filename_template += "/TmpFile-XXXXXX";
-    filename_.reset(strdup(filename_template.c_str()));
-    CHECK(filename_ != NULL);
-    fd_ = mkstemp(filename_.get());
+    filename_ = getenv("ANDROID_DATA");
+    filename_ += "/TmpFile-XXXXXX";
+    fd_ = mkstemp(&filename_[0]);
     CHECK_NE(-1, fd_);
   }
 
   ~ScratchFile() {
-    int unlink_result = unlink(filename_.get());
+    int unlink_result = unlink(filename_.c_str());
     CHECK_EQ(0, unlink_result);
     int close_result = close(fd_);
     CHECK_EQ(0, close_result);
   }
 
   const char* GetFilename() const {
-    return filename_.get();
+    return filename_.c_str();
   }
 
   int GetFd() const {
@@ -58,7 +55,7 @@
   }
 
  private:
-  scoped_ptr_malloc<char> filename_;
+  std::string filename_;
   int fd_;
 };
 
@@ -76,13 +73,10 @@
       setenv("ANDROID_ROOT", root.c_str(), 1);
     }
 
-    android_data_.reset(strdup(is_host_ ? "/tmp/art-data-XXXXXX" : "/sdcard/art-data-XXXXXX"));
-    ASSERT_TRUE(android_data_ != NULL);
-    const char* android_data_modified = mkdtemp(android_data_.get());
-    // note that mkdtemp side effects android_data_ as well
-    ASSERT_TRUE(android_data_modified != NULL);
-    setenv("ANDROID_DATA", android_data_modified, 1);
-    art_cache_.append(android_data_.get());
+    android_data_ = (is_host_ ? "/tmp/art-data-XXXXXX" : "/sdcard/art-data-XXXXXX");
+    ASSERT_TRUE(mkdtemp(&android_data_[0]) != NULL);
+    setenv("ANDROID_DATA", android_data_.c_str(), 1);
+    art_cache_.append(android_data_.c_str());
     art_cache_.append("/art-cache");
     int mkdir_result = mkdir(art_cache_.c_str(), 0700);
     ASSERT_EQ(mkdir_result, 0);
@@ -121,7 +115,7 @@
     closedir(dir);
     int rmdir_cache_result = rmdir(art_cache_.c_str());
     ASSERT_EQ(0, rmdir_cache_result);
-    int rmdir_data_result = rmdir(android_data_.get());
+    int rmdir_data_result = rmdir(android_data_.c_str());
     ASSERT_EQ(0, rmdir_data_result);
 
     // icu4c has a fixed 10-element array "gCommonICUDataArray".
@@ -172,7 +166,7 @@
   }
 
   bool is_host_;
-  scoped_ptr_malloc<char> android_data_;
+  std::string android_data_;
   std::string art_cache_;
   scoped_ptr<const DexFile> java_lang_dex_file_;
   std::vector<const DexFile*> boot_class_path_;
@@ -181,3 +175,21 @@
 };
 
 }  // namespace art
+
+namespace std {
+
+// TODO: isn't gtest supposed to be able to print STL types for itself?
+template <typename T>
+std::ostream& operator<<(std::ostream& os, const std::vector<T>& rhs) {
+  os << "[";
+  for (size_t i = 0; i < rhs.size(); ++i) {
+    os << rhs[i];
+    if (i < rhs.size() - 1) {
+      os << ", ";
+    }
+  }
+  os << "]";
+  return os;
+}
+
+}  // namespace std
diff --git a/src/runtime.cc b/src/runtime.cc
index 33b372b..e628f2c 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -61,34 +61,6 @@
   // notreached
 }
 
-// Splits a C string using the given delimiter characters into a vector of
-// strings. Empty strings will be omitted.
-void Split(const char* str, const char* delim, std::vector<std::string>& vec) {
-  DCHECK(str != NULL);
-  DCHECK(delim != NULL);
-  scoped_ptr_malloc<char> tmp(strdup(str));
-  char* full = tmp.get();
-  char* p = full;
-  while (p != NULL) {
-    p = strpbrk(full, delim);
-    if (p != NULL) {
-      p[0] = '\0';
-    }
-    if (full[0] != '\0') {
-      vec.push_back(std::string(full));
-    }
-    if (p != NULL) {
-      full = p + 1;
-    }
-  }
-}
-
-// Splits a colon delimited list of pathname elements into a vector of
-// strings.  Empty strings will be omitted.
-void ParseClassPath(const char* class_path, std::vector<std::string>& vec) {
-  Split(class_path, ":", vec);
-}
-
 // Parse a string of the form /[0-9]+[kKmMgG]?/, which is used to specify
 // memory sizes.  [kK] indicates kilobytes, [mM] megabytes, and
 // [gG] gigabytes.
@@ -182,7 +154,7 @@
                          std::vector<const DexFile*>& boot_class_path_vector) {
   CHECK(boot_class_path_cstr != NULL);
   std::vector<std::string> parsed;
-  ParseClassPath(boot_class_path_cstr, parsed);
+  Split(boot_class_path_cstr, ':', parsed);
   for (size_t i = 0; i < parsed.size(); ++i) {
     const DexFile* dex_file = Open(parsed[i]);
     if (dex_file != NULL) {
@@ -268,7 +240,7 @@
       parsed->properties_.push_back(option.substr(strlen("-D")).data());
     } else if (option.starts_with("-verbose:")) {
       std::vector<std::string> verbose_options;
-      Split(option.substr(strlen("-verbose:")).data(), ",", verbose_options);
+      Split(option.substr(strlen("-verbose:")).data(), ',', verbose_options);
       for (size_t i = 0; i < verbose_options.size(); ++i) {
         parsed->verbose_.insert(verbose_options[i]);
       }
diff --git a/src/runtime_linux.cc b/src/runtime_linux.cc
index 9b9cc07..c87825c 100644
--- a/src/runtime_linux.cc
+++ b/src/runtime_linux.cc
@@ -6,7 +6,6 @@
 #include <execinfo.h>
 
 #include "logging.h"
-#include "scoped_ptr.h"
 #include "stringprintf.h"
 
 namespace art {
@@ -18,9 +17,11 @@
 
   // http://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html
   int status;
-  scoped_ptr_malloc<char> result(abi::__cxa_demangle(mangled_name.c_str(), NULL, NULL, &status));
-  if (result != NULL) {
-    return result.get();
+  char* name(abi::__cxa_demangle(mangled_name.c_str(), NULL, NULL, &status));
+  if (name != NULL) {
+    std::string result(name);
+    free(name);
+    return result;
   }
 
   return mangled_name + "()";
@@ -35,7 +36,7 @@
   size_t frame_count = backtrace(frames, MAX_STACK_FRAMES);
 
   // Turn them into something human-readable with symbols.
-  scoped_ptr_malloc<char*> symbols(backtrace_symbols(frames, frame_count));
+  char** symbols = backtrace_symbols(frames, frame_count);
   if (symbols == NULL) {
     PLOG(ERROR) << "backtrace_symbols failed";
     return;
@@ -48,7 +49,7 @@
   // libartd.so:-1] 	#00 art::Runtime::PlatformAbort(char const*, int) +0x15b [0xf770dd51]
 
   for (size_t i = 0; i < frame_count; ++i) {
-    std::string text(symbols.get()[i]);
+    std::string text(symbols[i]);
 
     size_t index = text.find('(');
     std::string filename(text.substr(0, index));
@@ -63,6 +64,8 @@
     std::string log_line(StringPrintf("\t#%02d ", i) + function_name + text);
     LogMessage(filename.c_str(), -1, ERROR, -1).stream() << log_line;
   }
+
+  free(symbols);
 }
 
 }  // namespace art
diff --git a/src/runtime_test.cc b/src/runtime_test.cc
index 75c003b..59e39d6 100644
--- a/src/runtime_test.cc
+++ b/src/runtime_test.cc
@@ -4,66 +4,9 @@
 #include "common_test.h"
 
 namespace art {
-void ParseClassPath(const char* class_path, std::vector<std::string>& vec);
 
 class RuntimeTest : public CommonTest {};
 
-TEST_F(RuntimeTest, ParseClassPath) {
-  std::vector<std::string> vec;
-
-  art::ParseClassPath("", vec);
-  EXPECT_EQ(0U, vec.size());
-  vec.clear();
-
-  art::ParseClassPath(":", vec);
-  EXPECT_EQ(0U, vec.size());
-  vec.clear();
-
-  art::ParseClassPath(":foo", vec);
-  EXPECT_EQ(1U, vec.size());
-  vec.clear();
-
-  art::ParseClassPath("foo:", vec);
-  EXPECT_EQ(1U, vec.size());
-  vec.clear();
-
-  art::ParseClassPath(":foo:", vec);
-  EXPECT_EQ(1U, vec.size());
-  vec.clear();
-
-  art::ParseClassPath("foo:bar", vec);
-  EXPECT_EQ(2U, vec.size());
-  vec.clear();
-
-  art::ParseClassPath(":foo:bar", vec);
-  EXPECT_EQ(2U, vec.size());
-  vec.clear();
-
-  art::ParseClassPath("foo:bar:", vec);
-  EXPECT_EQ(2U, vec.size());
-  vec.clear();
-
-  art::ParseClassPath(":foo:bar:", vec);
-  EXPECT_EQ(2U, vec.size());
-  vec.clear();
-
-  art::ParseClassPath("foo:bar:baz", vec);
-  EXPECT_EQ(3U, vec.size());
-  vec.clear();
-
-  art::ParseClassPath(":foo:bar:baz", vec);
-  EXPECT_EQ(3U, vec.size());
-  vec.clear();
-
-  art::ParseClassPath("foo:bar:baz:", vec);
-  EXPECT_EQ(3U, vec.size());
-  vec.clear();
-
-  art::ParseClassPath(":foo:bar:baz:", vec);
-  EXPECT_EQ(3U, vec.size());
-  vec.clear();
-}
-
 TEST_F(RuntimeTest, ParsedOptions) {
   void* test_vfprintf = reinterpret_cast<void*>(0xa);
   void* test_abort = reinterpret_cast<void*>(0xb);
diff --git a/src/utils.cc b/src/utils.cc
index 695cbb3..b908c4d 100644
--- a/src/utils.cc
+++ b/src/utils.cc
@@ -189,4 +189,20 @@
   return long_name;
 }
 
+void Split(const std::string& s, char delim, std::vector<std::string>& result) {
+  const char* p = s.data();
+  const char* end = p + s.size();
+  while (p != end) {
+    if (*p == delim) {
+      ++p;
+    } else {
+      const char* start = p;
+      while (++p != end && *p != delim) {
+        // Skip to the next occurrence of the delimiter.
+      }
+      result.push_back(std::string(start, p - start));
+    }
+  }
+}
+
 }  // namespace art
diff --git a/src/utils.h b/src/utils.h
index 4b3e57e..3a6f404 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -8,6 +8,9 @@
 #include "stringpiece.h"
 #include "stringprintf.h"
 
+#include <string>
+#include <vector>
+
 namespace art {
 
 class Field;
@@ -170,6 +173,10 @@
 // Returns the current date in ISO yyyy-mm-dd hh:mm:ss format.
 std::string GetIsoDate();
 
+// Splits a string using the given delimiter character into a vector of
+// strings. Empty strings will be omitted.
+void Split(const std::string& s, char delim, std::vector<std::string>& result);
+
 }  // namespace art
 
 #endif  // ART_SRC_UTILS_H_
diff --git a/src/utils_test.cc b/src/utils_test.cc
index 769dec5..3d53c35 100644
--- a/src/utils_test.cc
+++ b/src/utils_test.cc
@@ -103,4 +103,70 @@
   EXPECT_EQ("Java_java_lang_String_copyValueOf___3CII", JniLongName(m));
 }
 
+TEST_F(UtilsTest, Split) {
+  std::vector<std::string> actual;
+  std::vector<std::string> expected;
+
+  expected.clear();
+
+  actual.clear();
+  Split("", ':', actual);
+  EXPECT_EQ(expected, actual);
+
+  actual.clear();
+  Split(":", ':', actual);
+  EXPECT_EQ(expected, actual);
+
+  expected.clear();
+  expected.push_back("foo");
+
+  actual.clear();
+  Split(":foo", ':', actual);
+  EXPECT_EQ(expected, actual);
+
+  actual.clear();
+  Split("foo:", ':', actual);
+  EXPECT_EQ(expected, actual);
+
+  actual.clear();
+  Split(":foo:", ':', actual);
+  EXPECT_EQ(expected, actual);
+
+  expected.push_back("bar");
+
+  actual.clear();
+  Split("foo:bar", ':', actual);
+  EXPECT_EQ(expected, actual);
+
+  actual.clear();
+  Split(":foo:bar", ':', actual);
+  EXPECT_EQ(expected, actual);
+
+  actual.clear();
+  Split("foo:bar:", ':', actual);
+  EXPECT_EQ(expected, actual);
+
+  actual.clear();
+  Split(":foo:bar:", ':', actual);
+  EXPECT_EQ(expected, actual);
+
+  expected.push_back("baz");
+
+  actual.clear();
+  Split("foo:bar:baz", ':', actual);
+  EXPECT_EQ(expected, actual);
+
+  actual.clear();
+  Split(":foo:bar:baz", ':', actual);
+  EXPECT_EQ(expected, actual);
+
+  actual.clear();
+  Split("foo:bar:baz:", ':', actual);
+  EXPECT_EQ(expected, actual);
+
+  actual.clear();
+  Split(":foo:bar:baz:", ':', actual);
+  EXPECT_EQ(expected, actual);
+}
+
 }  // namespace art
